Шрифт:
Интервал:
Закладка:
Внутренние операторы SELECT, которые возвращают единственное (скалярное) значение для вывода или для сравнения в предикате
Локальные переменные
Именованные хранимые процедуры, триггеры или (в ESQL) переменные приложений, содержащие значения, которые могут изменяться в процессе выполнения
Идентификаторы функций
Идентификаторы внутренних или внешних функций в функциональных выражениях
CAST(значение AS тип-данных)
Функциональные выражения, явно преобразующие значение одного типа данных в другой тип данных
Условные выражения
Функции, объявляющие два или более взаимоисключающих условия для одного столбца, начинающиеся с ключевого слова CASE, COALESCE или NULLIF
Круглые скобки
Используются для группирования выражений. Операции внутри скобок выполняются перед операциями вне скобок. Когда используются вложенные скобки, вначале вычисляются значения самых внутренних выражений, затем вычисления перемещаются вверх по уровням вложенности
Предложение COLLATE
Может быть применено со значениями CHAR и VARCHAR, чтобы использовать строковые сравнения в указанной последовательности сортировки
Операторы SQL
Синтаксис SQL Firebird включает операторы для сравнения и вычисления значений столбцов, констант, переменных и выражений встраиваемого SQL для получения различных утверждений.
Приоритет операторов
Приоритет определяет порядок, в котором операторы и создаваемые ими значения вычисляются в выражении.
Когда выражение содержит несколько операторов одного и того же типа, операторы вычисляются слева направо, если только не существует конфликта, когда два оператора одного и того же типа воздействуют на одни и те же значения. Когда возникает конфликт, приоритет операторов определяется типом. В табл. 21.2 показаны приоритеты типов операторов Firebird от высшего к низшему.
Таблица 21.2. Приоритеты типов операторов
Тип оператора
Приоритет
Объяснение
Конкатенация
1
Строки объединяются до выполнения любых других операций
Арифметический
2
Арифметические операции выполняются после конкатенации строк, но перед выполнением сравнений и логических операций
Сравнение
3
Операции сравнения вычисляются после конкатенации строк и выполнения арифметических операций, но до логических операций
Логический
4
Логические операции выполняются после всех других операций.
Приоритет: когда условия поиска являются комбинированными, порядок вычислений определяется приоритетом используемых операторов, NOT вычисляется перед AND, а AND вычисляется перед OR. Круглые скобки могут использоваться для изменения порядка вычисления
Оператор конкатенации
Оператор конкатенации (и) соединяет две символьные строки и создает одну строку. Символьные строки могут быть константами или значениями, полученными из столбцов:
SELECT Last_name ||', ' || First_Name AS Full_Name FROM Membership;
! ! !
ПРИМЕЧАНИЕ. Firebird более требователен к переполнению строк, чем его предшественники. Он проверит длину входных столбцов и заблокирует конкатенацию, если результирующий размер потенциально может превысить лимит для VARCHAR (32 765 байтов).
. ! .
Арифметические операции
Арифметические выражения вычисляются слева направо за исключением случаев, когда возникает двусмысленность. В этих случаях арифметические операции вычисляются в соответствии с приоритетами, описанными в табл. 21.3. Например, умножение выполняется до деления, а деление выполняется до вычитания.
Арифметические операции всегда выполняются до сравнений и логических операций. Для изменения порядка вычислений сгруппируйте операции с помощью круглых скобок.
Таблица 21.3. Приоритеты арифметических операций
Оператор
Назначение
Приоритет
*
Умножение
1
/
Деление
2
+
Сложение
3
-
Вычитание
4
Следующий пример иллюстрирует, как сложное вычисление может быть сделано вложенным, для обеспечения того, чтобы выражение вычислялось в корректном, недвусмысленном порядке:
. . .
SET COLUMN_A = 1/((COLUMN_B * COLUMN_C/4) - ( (COLUMN_D / 10) + 28))
Сервер может определить синтаксические ошибки - такие как несбалансированные скобки или включенное приложение, которое не дает результата, - но он не может определить логические ошибки или двусмысленности, которые являются синтаксически корректными. Очень запутанные вложенные выражения теоретически должны работать. Для упрощения процесса объединения таких предикатов всегда начинайте с изоляции самой внутренней операции и продолжайте работать "изнутри наружу", проверяя предикаты на калькуляторе на каждом шаге.
Операторы сравнения
Операторы сравнения проверяют отношение между значением в левой части оператора и значением или диапазоном значений в правой части оператора. Каждая проверка дает результат, который может быть истиной или ложью. Правила приоритета, применимые в вычислениях, указаны в табл. 21.4.
Таблица 21.4. Приоритеты операторов сравнения
Оператор
Назначение
Приоритет
=
Равно, идентично
1
<>, !=, ~=, ^=
Не равно
2
>
Больше
3
<
Меньше
4
>=
Больше или равно
5
<=
Меньше или равно
6
!>, ~>, ^>
Не больше
7
!<, ~<, ^<
Не меньше
8
Сравнения, которым встречается NULL В левой или правой части оператора, всегда следуют правилам логики SQL, вычисляя результат сравнения как NULL и возвращая ложь, например:
IF (YEAR_OF_BIRTH < 1950)
Это сравнение вернет ложь, если YEAR_OF_BIRTH равняется 1950, больше него или имеет значение NULL.
Подробное обсуждение NULL см. в разд. "Обсуждение NULL".
Пары сравниваемых значений могут быть столбцами, константами или вычисляемыми выражениями[73], они должны быть вычислены в том же типе данных. Функция CAST() может быть использована для трансляции в тип данных, совместимый для сравнения.
Арифметические предикаты, использующие эти символы, не требуют пояснения. При этом символьные проверки также могут их использовать. Проверки, использующие сравнения = и <>, понятны. Следующий оператор использует оператор >=, чтобы вернуть все строки, где LAST_NAME равен тестируемой строке, а также те строки, где LAST NAME рассматривается в алфавитно-цифровом порядке, как "больше, чем":
SELECT * FROM EMPLOYEE
WHERE LAST_NAME >= 'Smith';
В таблице EMPLOYEE нет значений 'Smith', HO запрос вернет 'Stansbury', 'Steadman' и так далее вплоть до 'Young'. База данных Employee в этом примере использует набор символов NONE, в котором символы в нижнем регистре имеют приоритет перед символами в верхнем регистре. В нашем примере строка 'SMITH' не будет выбрана, потому что искомая строка 'SM' (83 + 77) будет меньше, чем 'SM' (83 + 109).
Наборы символов и последовательности сортировкиАлфавитно-цифровые последовательности определяются на двух уровнях: набор символов и последовательность сортировки. Каждый набор символов имеет свои собственные уникальные правила приоритетов. Когда используется альтернативная последовательность сортировки, то правила последовательности сортировки перекрывают правила набора символов.
Последовательность сортировки по умолчанию для каждого набора символов - та последовательность, чье имя соответствует имени набора символов, - является бинарной. Двоичная последовательность сортировки определяет возрастание по цифровым кодам символа в той системе, в которой он кодирован (ASCII, ANSI, Unicode и т.д.). Альтернативные последовательности сортировки обычно перекрывают порядок по умолчанию, чтобы соблюдать локальные или специальные правила, такие как нечувствительность к регистру или упорядочение по словарю[74].
Другие предикаты сравнения
Предикаты BETWEEN, CONTAINING, LIKE и STARTING WITH, представленные в табл. 21.5, имеют одинаковый приоритет при вычислениях в операторах сравнения, описанных
в табл. 21.4. Если они конфликтуют друг с другом, то вычисление осуществляется строго слева направо.
Таблица 21.5. Другие предикаты сравнения
Предикат
Назначение
BETWEEN ... AND ...
Значение попадает во включающий диапазон значений
CONTAINING
- Delphi. Учимся на примерах - Сергей Парижский - Программирование
- Сделай видеоигру один и не свихнись - Слава Грис - Программирование / Руководства
- Психбольница в руках пациентов - Алан Купер - Программирование