Справка по SQL - страница 15

Шрифт
Интервал

стр.

Вот, например, как можно определить, сколько имеется разных букв, с которых начинаются названия кораблей в таблице Ships:


>SELECT COUNT(DISTINCT ASCII(name)) FROM Ships


Результат - 11. Чтобы выяснить, какие это буквы, мы можем применить функцию CHAR, которая возвращает символ по известному ASCII-коду (от 0 до 255):


>SELECT DISTINCT CHAR(ASCII(name)) FROM Ships ORDER BY 1


Следует отметить, что аналогичный результат можно получить проще с помощью еще одной функции - LEFT, которая имеет следующий синтаксис:


и вырезает заданное вторым аргументом число символов слева из строки, являющейся первым аргументом. Итак,


>SELECT DISTINCT LEFT(name, 1) FROM Ships ORDER BY 1


А вот как, например, можно получить таблицу кодов всех алфавитных символов:


>SELECT CHAR(ASCII('a')+ num-1) letter, ASCII('a')+ num - 1 [code]

>FROM (SELECT 5*5*(a-1)+5*(b-1) + c AS num

> FROM (SELECT 1 a UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5) x

> CROSS JOIN

> (SELECT 1 b UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5) y

> CROSS JOIN

> (SELECT 1 c UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5) z

> ) x

>WHERE ASCII('a')+ num -1 BETWEEN ASCII('a') AND ASCII('z')


Тех, кто еще не в курсе генерации числовой последовательности, отсылаю к соответствующей статье .

Как известно, коды строчных и прописных букв отличаются. Поэтому чтобы получить полный набор без переписывания запроса, достаточно просто дописать к вышеприведенному коду аналогичный:


>UNION

>SELECT CHAR(ASCII('A')+ num-1) letter, ASCII('A')+ num - 1 [code]

>FROM (SELECT 5*5*(a-1)+5*(b-1) + c AS num

> FROM (SELECT 1 a UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5) x

> CROSS JOIN

> (SELECT 1 b UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5) y

> CROSS JOIN

> (SELECT 1 c UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5) z

> ) x

>WHERE ASCII('A')+ num -1 BETWEEN ASCII('A') AND ASCII('Z')


Чтобы таблица выглядела более патриотично, достаточно заменить латинские буквы "a" и "A" на неотличимые на взгляд русские - "а" и "А", а "z" и "Z" на "я" и "Я". Вот только буквы "ё" вы не увидите в этой таблице, т.к. в кодовой таблице ASCII эти символы лежат отдельно, что легко проверить:


>SELECT ASCII('ё') UNION ALL SELECT ASCII('Ё')


Я полагаю, что не будет сложным добавить эту букву в таблицу, если потребуется.

Рассмотрим теперь задачу определения нахождения искомой подстроки в строковом выражении. Для этого могут использоваться две функции - CHARINDEX и PATINDEX. Обе они возвращают начальную позицию (позицию первого символа подстроки) подстроки в строке. Функция CHARINDEX имеет синтаксис:

CHARINDEX (искомое_выражение, строковое_выражение[, стартовая_позиция])

Здесь необязательный целочисленный параметр стартовая_позиция определяет позицию в строковом выражении, начиная с которой выполняется поиск искомого_выражения . Если этот параметр опущен, поиск выполняется от начала строкового_выражения. Например, запрос


>SELECT name FROM Ships WHERE CHARINDEX('sh', name) 0


будет выводить те корабли, в которых имеется сочетание символов "sh". Здесь используется тот факт, что если искомая строка не будет обнаружена, то функция CHARINDEX возвращает 0. Результат выполнения запроса будет содержать следующие корабли:

name

Kirishima

Musashi

Washington


Следует отметить, что если искомая подстрока либо строковое выражение есть NULL, то результатом функции тоже будет NULL.

Следующий пример определяет позиции первого и второго вхождения символа "a" в имени корабля "California"


>SELECT CHARINDEX('a',name) first_a,

> CHARINDEX('a', name, CHARINDEX('a', name)+1) second_a

>FROM Ships WHERE name='California'


Обратите внимание, что при определении второго символа в функции используется стартовая позиция, которой является позиция следующего за первой буквой "a" символа - CHARINDEX('a', name)+1. Правильность результата - 2 и 10 - легко проверить :-).

Функция PATINDEX имеет синтаксис:


Главное отличие этой функции от CHARINDEX заключается в том, что поисковая строка может содержать подстановочные знаки - % и _. При этом концевые знаки "%" являются обязательными. Например, использование этой функции в первом примере будет иметь вид


стр.

Похожие книги