Операторы 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)