FirebirdSQL logo

Выражения

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

Описание элементов языка
Имя столбца

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

Элементы массива

В выражении может содержаться ссылка на элемент массива, т.е. <array_name>[s], где s — индекс элемента в массиве.

Арифметические операторы

Символы +, -, *, / используемые для вычисления значений.

Оператор конкатенации

Оператор || (“две вертикальные линии”) используется для соединения символьных строк.

Логические операторы

Зарезервированные слова NOT, AND и OR используются прикомбинировании простых условий поиска для создания сложныхутверждений.

Операторы сравнения

Символы =, <>, !=, ~=, ^=, <, <=, >, >=, !<, ~<, ^<, !>, ~> и ^>

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

LIKE, STARTING WITH, CONTAINING, SIMILAR TO, BETWEEN, IS [NOT]NULL, IS [NOT] {TRUE | FALSE | UNKNOWN}, и IS [NOT] DISTINCT FROM

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

Предикаты, используемые для проверки существования значений внаборе. Предикат IN может быть использован как с наборами констант,так и со скалярными подзапросами. Предикаты EXISTS, SINGULAR, ALLANY, SOME могут быть использованы только с подзапросами.

Константы и литералы

Числа, заключённые в апострофы строковые литералы, логическиезначения TRUE, FALSE и UNKNOWN, псевдозначение NULL.

Литералы дат и времени

Выражения, подобные строковым литералам, заключённые вапострофах, которые могут быть интерпретированы как значения даты,времени или даты-времени. Литералами дат могут быть строки изсимволов и чисел, такие как TIMESTAMP '25.12.201615:30:35', которые могут быть преобразованы в дату, времяили дату с временем.

Мнемоники дат и времени

Строковый литерал с описанием желаемого значения даты и/иливремени, которое можно привести к типу даты и/или времени. Дляпримера 'NOW', 'TODAY'.

Контекстные переменные

Встроенные контекстные переменные.

Локальные переменные

Локальные переменные, входные или выходные параметры PSQL модулей(хранимых процедур, триггеров, анонимных блоков PSQL).

Позиционные параметры

В DSQL в качестве параметров запроса могут быть использованытолько позиционные параметры. Позиционные параметры представляютсобой знаки вопроса (?) внутри DSQL оператора. Доступ к такимпараметрам осуществляется по его номеру (позиции в запросеотносительно предыдущего позиционного параметра) поэтому ониназываются позиционными. Обычно компоненты доступа позволяютработать с именованными параметрами, которые они самипреобразовывают в позиционные.

Подзапросы

Оператор SELECT заключённый в круглые скобки, который возвращаетодно единственное (скалярное) значение или множество значений (прииспользовании в предикатах существования).

Идентификаторы функций

Идентификаторы встроенных или внешних функций в функциональныхвыражениях.

Приведения типа

Выражение явного преобразования одного типа данных в другой с использованием CAST какCAST(<value> AS <datatype>).

Условные выражения

Выражение CASE и встроенные функции COALESCE, NULLIF.

Круглые скобки

Пара скобок ( …​ ) используются для группировки выражений.Операции внутри скобок выполняются перед операциями вне скобок. Прииспользовании вложенных скобок, сначала вычисляются значения самыхвнутренних выражений, а затем вычисления перемещаются наверх поуровням вложенности.

Предложение COLLATE

Предложение применяется к типам CHAR и VARCHAR, чтобы в указаннойкодировке установить параметры сортировки, используемые присравнении.

NEXT VALUE FOR sequence

Конструкция NEXT VALUE FOR позволяет получить следующее значениепоследовательности, то же самое делает встроенная функция GEN_ID().

Выражение AT

Выражение для изменения часового пояса даты и времени.

Литералы (константы)

Литерал или константа — это значение, подставляемое непосредственно в SQL оператор, которое не получено из выражения, параметра, ссылки на столбец или переменной.

Строковые литералы

Строковый литерал это последовательность символов, заключенных между парой апострофов (“одинарных кавычек”). Максимальная длина строковой константы составляет 65535 байт; максимальная количество символов будет определяться количеством байт, используемых для кодирования каждого символа.

Синтаксис:
<character string literal> ::=
  [ <introducer> <character set specification> ]
    <quote> [ <character representation>... ] <quote>
    [ { <separator> <quote> [ <character representation>... ] <quote> }... ]

<separator> ::=
  { <comment> | <white space> }

<introducer> ::= underscore (U+005F)

<quote> ::= apostrophe (U+0027)

<char> ::= character representation;
apostrophe is escaped by doubling
Example 1. Простой строковый литерал
'Hello world'

Если литерал апострофа требуется в строковой константе, то он может быть “экранирован” другим предшествующим апострофом.

Example 2. Строковый литерал содержащий апостроф
'Mother O''Reilly's home-made hooch'

Другой способ записать данный строковый литерал использовать альтернативные кавычки:

q'{Mother O'Reilly's home-made hooch}'

При необходимости строковый литерал может быть "прерван" пробелом или комментарием.Это может быть использовано для разбиения длинного литерала на несколько строк или предоставления встроенных комментариев.

Example 3. Строковые литералы прерванные пробелом и комментарием
-- whitespace between literal
select 'ab'
       'cd'
from RDB$DATABASE;
-- output: 'abcd'

-- comment and whitespace between literal
select 'ab' /* comment */ 'cd'
from RDB$DATABASE;
-- output: 'abcd'
Note
  • Двойные кавычки не должны (допускаются 1 диалектом) использоваться для квотирования строк. В SQL они предусмотрены для других целей.

  • Необходимо быть осторожным с длиной строки, если значение должно быть записано в столбец типа VARCHAR. Максимальная длина строки для типа VARCHAR составляет 32765 байт (32767 для типа CHAR). Если значение должно быть записано в столбец типа BLOB, то максимальная длина строкового литерала составляет 65535 байт.

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

Альтернативы для апострофов в строковых литералах

Вместо двойного (экранированного) апострофа вы можете использовать другой символ или пару символов.

Ключевое слово q или Q предшествующее строке в кавычках сообщает парсеру, что некоторые левые и правые пары одинаковых символов являются разделителями для встроенного строкового литерала.

Синтаксис:
<alternate string literal> ::=
  { q | Q } <quote> <alternate start char>
  [ { <char> }... ]
  <alternate end char> <quote>
Note
Правила использования

Когда <alternate start char> является одним из символов '(', '{', '[' или '<', то <alternate end char> должен бытьиспользован в паре с соответствующим “партнёром”, а именно ')', '}', ']' или '>'. В других случаях <alternate end char> совпадает с <alternate start char>.

Внутри строки, т.е. <char> элементах, одиночные (не экранированные) кавычки могут быть использованы.Каждая кавычка будет частью результирующей строки.

Example 1. Использование альтернативных апострофов в строковых литералах
-- result: abc{def}ghi
SELECT Q'{abc{def}ghi}' FROM rdb$database;

-- result: That's a string
SELECT Q'!That's a string!' FROM rdb$database;
Example 2. Динамическая сборка запроса использующего строковые литералы.
EXECUTE BLOCK
RETURNS (
  RDB$TRIGGER_NAME CHAR(64)
)
AS
  DECLARE VARIABLE S VARCHAR(8191);
BEGIN
  S = 'SELECT RDB$TRIGGER_NAME FROM RDB$TRIGGERS WHERE RDB$RELATION_NAME IN ';
  S = S || Q'! ('SALES_ORDER', 'SALES_ORDER_LINE')!';
  FOR
    EXECUTE STATEMENT :S
    INTO :RDB$TRIGGER_NAME
  DO
    SUSPEND;
END