Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
db_lectures / 09. Предикаты сравнения и LIKE.docx
Скачиваний:
30
Добавлен:
21.05.2015
Размер:
15.59 Кб
Скачать

Предикаты сравнения

Предикат сравнения представляет собой два выражения, соединяемых оператором сравнения. Имеется шесть традиционных операторов сравнения: =, >, <, >=, <=, <>.

Данные типа NUMERIC (числа) сравниваются в соответствии с их алгебраическим значением.

Данные типа CHARACTER STRING (символьные строки) сравниваются в соответствии с их алфавитной последовательностью. Если а1а2…аn и в1 в…вn — две последовательности символов, то первая «меньше» второй, если а1 < в1, или а1 = в1 и а2 < в2 и т. д. Считается также, что а1а2…аn < в1в2…вm, если n < m и а1а2…аn = в1в2…вn, то есть если первая строка является префиксом второй. Например, ‘folder’ < ‘for’, так как первые две буквы этих строк совпадают, а третья буква строки ‘folder’ предшествует третьей букве строки ‘for’. Также справедливо неравенство ‘bar’ < ‘barber’, поскольку первая строка является префиксом второй.

Данные типа DATETIME (дата/время) сравниваются в хронологическом порядке.

Использование значения null в условиях поиска

Обращаем ваше внимание на то, ч то рассмотренные выше операторы сравнения “=, <, >, <=, >=, <>” и оп ера торы IN, BETWEEN и LIKE ни в коем случае нельзя использовать для проверки содержимого поля на наличие в нем пустого значения NULL. Для этих целей специально предназначен оператор

IS [NOT] NULL

Использование в этих случаях обычных предикатов сравнения может привести к неверным результатам, так как сравнение со значением NULL дает результат UNKNOWN (неизвестно).

Так, если требуется найти записи, для которых в столбце price отсутствует значение:

SELECT * FROM PC WHERE price IS NULL

Характерной ошибкой является написание предиката в виде:

WHERE price = NULL;

Этому предикату не соответствует ни одной строки, поэтому результирующий набор записей будет пуст, даже если имеются изделия с неизвестной ценой. Это происходит потому, что сравнение с NULL-значением согласно предикату сравнения оценивается как UNKNOWN.

Предикат like

LIKE::= <Выражение для вычисления значения строки>

[NOT] LIKE <Выражение для вычисления значения строки>

[ESCAPE <символ>]

Предикат LIKE сравнивает строку, указанную в первом выражении, для вычисления значения строки, называемого проверяемым значением, с образцом, который определен во втором выражении для вычисления значения строки.

В образце разрешается использовать два трафаретных символа:

  • символ подчеркивания (_), который можно применять вместо любого единичного символа в проверяемом значении;

  • символ процента (%) заменяет последовательность любых символов (число символов в последовательности может быть от 0 и более) в проверяемом значении.

Пример. Запрос, выбирающий из таблицы STUDENT сведения о студентах, у которых фамилии начинаются на букву “Р”.

SELECT * FROM STUDENT WHERE SURNAME LIKE ‘Р %’;

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

Образец Описание

'abc%' Любые строки, которые начинаются с букв «abc»

'abc_' Строки длиной строго 4 символа, причем первыми символами строки должны быть «abc»

'%z' Любая последовательность символов, которая обязательно заканчивается символом «z»

'%Rostov%' Любая последовательность символов, содержащая слово «Rostov» в любой позиции строки

Если искомая строка содержит трафаретный символ, то следует задать управляющий символ в предложении ESCAPE. Этот управляющий символ должен использоваться в образце перед трафаретным символом, сообщая о том, что последний следует трактовать как обычный символ. Например, если в некотором поле следует отыскать все значения, содержащие символ «_», то шаблон ‘%_%’ приведет к тому, что будут возвращены все записи из таблицы. В данном случае шаблон следует записать следующим образом:

'%#_%' ESCAPE '#'

Для проверки значения на соответствие строке «25%» можно воспользоваться таким предикатом:

LIKE '25|%' ESCAPE '|'

Истинностное значение предиката LIKE присваивается в соответствии со следующими правилами:

  • если либо проверяемое значение, либо образец, либо управляющий символ есть NULL, истинностное значение равно UNKNOWN;

  • в противном случае, если проверяемое значение и образец имеют нулевую длину, истинностное значение равно TRUE;

  • в противном случае, если проверяемое значение соответствует шаблону, то предикат LIKE равен TRUE;

  • если не соблюдается ни одно из перечисленных выше условий, предикат LIKE равен FALSE.

Однако в Transact-SQL, помимо стандартных символов-шаблонов ("%" и "_"), существует еще пара символов, которые делают этот предикат LIKE более гибким инструментом. Этими символами являются:

  • [] – вместо символа строки будет подставлен один из возможных символов, указанный в этих ограничителях.

  • [^] – вместо соответствующего символа строки будут подставлены все символы, кроме указанных в ограничителях.

--WHERE name LIKE'5%' -- начинается с 5

--WHERE name LIKE '5[%]' -- 5%

--WHERE name LIKE '5|%' ESCAPE '|'-- 5%

--WHERE name LIKE '%5|%%' ESCAPE '|' -- 5% в любом месте строки

--WHERE name LIKE '[0-9][a-zA-Z]%' -- первая цифра, вторая буква

--WHERE name LIKE '[a-z][0-9]%' -- первая буква, вторая цифра

--WHERE name LIKE '[^0-9]%' -- начинается не на цифру.

--WHERE name LIKE '%[02468]%' -- содержит четную цифру.

--WHERE name LIKE '%[02468][13579]%' -- комбинация четная-нечетная.

Для case-insensitive матча регулярным выражением в постгресе используется оператор ILIKE, что является одной из самых известных его gotchas.

В postgresql есть эквиваленты указанных операторов. Они типичны только для Постгреса:

~~ эквивалентен LIKE

~~* эквивалентен ILIKE

!~~ эквивалентен NOT LIKE

!~~* эквивалентен NOT ILIKE

Предикат LIKE и регулярные выражения

Предикат LIKE в его стандартной редакции не поддерживает регулярных выражений, хотя ряд реализаций (в частности, Oracle) допускает их использование, расширяя возможности стандарта.

В SQL Server 2005/2008 использование регулярных выражений возможно через CLR, т.е. посредством языков Visual Studio, которые могут использоваться для написания хранимых процедур и функций.

SIMILAR TO

Этот оператор очень сильно похож на LIKE. Отличие лишь в том, что он интерпретирует регулярные выражения по стандарту SQL, который представляет собой любопытную смесь регэкспов нотации LIKE и общеупотребительных регэкспов.

Символы % и _ имеют точно такой же смысл, что и в LIKE, однако добавлены POSIX-подобные метасимволы:

  • | обозначает выбор одной либо другой альтернативы

  • обозначает повторение предыдущего элемента 0 или более раз

  • + обозначает повторение предыдущего элемента 1 или более раз

  • () могут быть использованы для группировки элементов в один логический атом

  • [] определяют класс символов в точности так, как это сделано в POSIX-совместимых регулярных выражениях.

Важно помнить, что метасимволы ограниченного повторения (? и {...}) в SIMILAR TO не поддерживаются, хотя они и существуют в POSIX. Также символ точки (.) не является метасимволом.

Стандартные примеры из документации:

SELECT 'abc' SIMILAR TO 'abc';

true

SELECT 'abc' SIMILAR TO 'a';

true

SELECT 'abc' SIMILAR TO '%(b|d)%';

true

test=# SELECT 'abc' SIMILAR TO '(b|c)%';

false

POSIX

Да, это всем удобные и привычные регулярные выражения с понятным синтаксисом. Эти возможности уникальны для Постгреса и отсутствуют (или реализованы в иначе) в других СУБД.

  • последовательность из 0 и более символов

  • + последовательность из 1 и более символов

  • ? последовательность из 0 или 1 символа

  • {m} повторенеие ровно m раз

  • {m,} повторенеие m и более раз

  • {m,n} повторенеие от m до n раз включительно

Регэкспы в POSIX-нотации работают в PostgreSQL со следующими операторами:

  • ~ осуществляет case-sensitive матч

  • ~* осуществляет case-insensitive матч

  • !~ и !~* означают отрицание вышеуказанных операторов

Стандартные примеры:

SELECT 'abc' ~ 'abc';

true

SELECT 'abc' ~ '^a';

true

SELECT 'abc' ~ '(b|d)';

true

SELECT 'abc' ~ '^(b|c)';

false

Однако, не совсем привычны некоторые ограничения в регекспах:

\A соответствует началу строки

\m соответствует началу слова

\M соответствует концу слова

\y соответствует началу или концу слова

\Y соответствует только не началу и не концу слова

\Z соответствует концу строки

Преобразование вывода и встроенные функции

В SQL реализованы операторы преобразования данных и встроенные функции, предназначенные для работы со значениями столбцов и/или константами в выражениях.

Числовые, символьные и строковые константы

В SQL имеется возможность применения значений выражений, построенных с использованием встроенных функций, констант, имен столбцов, которые определяются как своего рода виртуальные столбцы. Они помещаются в списке столбцов и могут сопровождаться псевдонимами.

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

SELECT ‘Фамилия’, SURNAME, ‘Имя’, NAME, 100 FROM STUDENT;

является таблица следующего вида

SURNAME NAME

Фамилия Иванов Имя Ив ан 100

Фамилия Петров Имя Петр 100

…… …… …… …… ……

Арифметические операции для преобразования числовых данных

Унарный оператор “–”

Бинарные операторы “+”, “– “, “*” и “/”

Например , результат запроса

SELECT SURNAME, NAME, STIPEND, –(STIPEND*KURS)/2

FROM STUDENT

WHERE KURS = 4 AND STIPEND > 0;

будет выглядеть следующим образом

SURNAME NAME STIPEND KURS

Сидоров Вадим 150 4 -300

Петров Антон 200 4 -400

…… …… …… …… ……

Символьная операция конкатенации строк

“||” позволяет соединять (“склеивать”) значения двух или более столбцов символьного типа или символьных констант в од ну строку. Синтаксис:

<значимое символьное выражение> {||}<значимое символьное выражение>.

SELECT SURNAME || ‘_’ || NAME, STIPEND

FROM STUDENT

WHERE KURS = 4 AND STIPEND > 0;

Результат

STIPEND

Сидоров_Вадим 150

Петров_Антон 200

…… ……

Символьные функции преобразования букв различных слов в строке

LOWER (<строка >) - перевод в нижний регистр

UPPER(<строка >) - перевод в верхний регистр

INITCAP(<строка >) - перевод первой буквы каждого слова строки в заглавную

Например :

SELECT LOWER(SURNAME), UPPER(NAME)

FROM STUDENT

WHERE KURS = 4 AND STIPEND > 0;

Результат

SURNAME NAME

Сидоров ВАДИМ

…… ……

LTRIM (<строка > [,<подстрока >]) - удаление левых граничных символов. Из <строки > удаляются слева символы, указанные в <подстроке>;

RTRIM – удаление правых граничных символов

LENGTH(<строка >) - определение длины строки

Функции работы с числами

ABS(<значимое числовое выражение>) – абсолютное значение

FLOOR(<значимое числовое выражение>) – урезает значение числа с плавающей точкой до наибольшего целого, не превосходящего заданное число

CEIL(<значимое числовое выражение>) – самое малое целое, которое равно или больше заданного числа

ROUND(<значимое числовое выражение>,<точность>) - функция округления

TRUNC(<значимое числовое выражение>,<точность>) функция усечения

Тригонометрические функции – COS, SIN, TAN

Гиперболические функции – COSH, SINH, TANH

Экспоненциальная функция – (EXP)

Логарифмические функции – (LN, LOG)

Функция возведения в степень – POWER (<значимое числовое выражение>,<экспонента >)

Определение знака числа – SIGN

Вычисление квадратного корня – SQRT