Операционная система ЗОСРВ «Нейтрино» > Руководство разработчика > Программные интерфейсы общего назначения > Прикладные библиотеки и технологии > Библиотека менеджера QDB > Справочник по командам SQL, поддерживаемым менеджером QDB > Выражения в SQL запросах



Выражения в SQL запросах

Выражения в SQL запросах, поддерживаемые в QDB

Формат
Описание
Литеральные значения
Параметры
LIKE
GLOB
Имена столбцов
Оператор SELECT
CAST
Функции
Основные функции
Агрегирующие функции

Формат

expr binary-op expr |
expr [NOT] { LIKE | GLOB } expr [ESCAPE expr] |
unary-op expr |
( expr ) |
[[database-name .] [table-name .] column-name |
literal-value |
parameter |
function-name ( expr-list | * ) |
expr ISNULL |
expr NOTNULL |
expr [NOT] BETWEEN expr AND expr |
expr [NOT] IN ( value-list ) |
expr [NOT] IN ( select-statement ) |
expr [NOT] IN [database-name .] table-name |
[EXISTS] ( select-statement ) |
CASE [expr] ( WHEN expr THEN expr )+ [ELSE expr] END |
CAST ( expr AS type )
expr COLLATE collation-name

Описание

Выражения SQL представляют собой подкомпоненты команд. QDB поддерживает следующие бинарные операторы (в порядке приоритета):

||
* / %
+ -
<< >> & |
< <= > >=
= == != <> IN
AND
OR

QDB поддерживает следующие унарные префиксные операторы:

- + ! ~ NOT

Оператор COLLATE можно рассматривать как унарный постфиксный оператор. Оператор COLLATE имеет наибольший приоритет — выше, чем любой префиксный унарный оператор или бинарный оператор.

Унарный оператор "+" не выполняет никаких действий. Он применяется к строкам, числам, объектам BLOB и возвращает значение своего операнда.

Обратите внимание, что существуют два варианта операторов равенства ("=" и "==") и неравенства ("!=" и "<>"). Оператор "||" выполняет «конкатенацию» — объединяет две строки, которые являются его операндами. Результатом оператора "%" является остаток левого операнда по модулю правого операнда.

Результатом любого бинарного оператора является число, за исключением оператора конкатенации "||", который возвращает строку.

Литеральные значения

Литеральное значение — это целое или вещественное число. QDB поддерживает экспоненциальный формат. Символ "." используется в качестве десятичной точки, даже если в настройках локали указана запятая (использование запятой в качестве десятичного знака приводит к синтаксической неоднозначности). Строковая константа образуется путем заключения строки в одиночные кавычки ("'"). Чтобы включить одиночную кавычку в состав самой строки, необходимо указать ее дважды, как в языке Паскаль. Управляющие последовательности в стиле языка C с символом обратной косой черты не поддерживаются, поскольку не предусмотрены в стандарте SQL. Литералы BLOB представляют собой строки, которые содержат шестнадцатеричные данные и начинаются с символа "x" или "X":

X'53514697465'

Литеральное значение также может быть равно NULL.

Параметры

Параметр — это компонент выражения, в котором хранится литеральное значение, определяемое на этапе выполнения программы с помощью функции qdb_stmt_exec(). Параметры задаются в нескольких форматах:

"?NNN"
Знак вопроса, за которым следует число NNN, указывает на элемент с номером NNN, Где NNN находится в диапазоне от 1 до 999.
"?"
Знак вопроса без последующего числа указывает на первый неиспользуемый параметр.
":AAAA"
Двоеточие с последующим идентификатором указывает на параметр с именем AAAA. QDB присваивает именованному параметру первое неиспользуемое число. Во избежание ошибок рекомендуется не смешивать именованные и нумерованные параметры.
"@AAAA"
Символ "@" действует так же, как двоеточие.
"$AAAA"
Символ доллара с последующим идентификатором также указывает на параметр с именем AAAA. В этом формате идентификатор состоит из одного или нескольких маркеров "::" и суффикса, который находится внутри последовательности символов "(...)" и содержит произвольный текст. Этот синтаксис соответствует имени переменной в языке Tcl.

Параметры, которым не присвоены значения с помощью функции qdb_stmt_exec(), считаются равными NULL.

LIKE

Оператор LIKE operator выполняет сравнение с шаблоном. Его правый операнд содержит шаблон, а левый операнд — строку, которая сравнивается с ним.

Символ процента ("%") в шаблоне соответствует любой последовательности любого (в том числе нулевого) количества символов в строке. Подчеркивание ("_") соответствует одному символу. Все остальные символы сравниваются друг с другом без учета регистра (буквы в верхнем и нижнем регистрах считаются одинаковыми). QDB ошибочно различает только верхний/нижний регистр 7-разрядных символов латинского алфавита, поэтому оператор LIKE чувствителен к регистру 8-разрядных символов в кодировках iso8859 и UTF-8. Например, выражение "'a' LIKE 'A'" равно TRUE, но выражение "'æ' LIKE 'Æ'" равно FALSE.

При наличии дополнительного условия ESCAPE значение последующего выражения должно являться строкой, которая содержит один символ. Этот символ можно использовать для указания литеральных символов подчеркивания и процента в шаблоне LIKE. Управляющий символ, за которым следует процент, подчеркивание или сам управляющий символ, включает в строку второй литерал. Инфиксный оператор LIKE реализуется посредством вызова пользовательской функции like( X,Y ).

GLOB

Оператор GLOB аналогичен LIKE, но в его шаблонах используется синтаксис подстановки имен файлов, поддерживаемый UNIX. Кроме того, оператор GLOB, в отличие от LIKE, чувствителен к регистру. Для изменения результата проверки на противоположный перед операторами GLOB и LIKE можно указывать ключевое слово NOT. Инфиксный оператор GLOB реализуется посредством вызова пользовательской функции glob( X, Y ) можно изменять его, переопределяя эту функцию.

Имена столбцов

В качестве имени столбца может использоваться любое имя, которое указано в операторе CREATE TABLE, а также специальные идентификаторы "ROWID", "OID" или "_ROWID_". Эти специальные идентификаторы описывают уникальный случайный целочисленный ключ (ключ строки), который назначается каждой строке каждой таблицы, но этот ключ используется только при условии, что в операторе CREATE TABLE не определен столбец с таким же именем. Работа с ключами строк выполняется так же, как со столбцами, доступными только для чтения. Можно использовать ключ строки в любом месте обычного столбца, но нельзя изменять его значение в операторе UPDATE или INSERT. Следует иметь в виду, что команда SELECT * ... не возвращает ключ строки.

Оператор SELECT

Операторы SELECT могут входить в состав выражений SQL в качестве правого операнда оператора IN, скалярной величины или операнда оператора EXISTS. Если оператор SELECT является скалярной величиной или правым операндом оператора IN, его результат должен содержать единственный столбец. Можно использовать составные операторы SELECT, которые соединены друг с другом ключевыми словами UNION или EXCEPT. В операторе EXISTS столбцы множества результатов SELECT игнорируются, а выражение имеет значение TRUE, если множество результатов содержит как минимум одну строку, и FALSE, если оно является пустым. Если переменные внешнего запроса не используются ни в одном условии выражения SELECT, оно вычисляется один раз перед дальнейшей обработкой, и его результат используется повторно при необходимости. Если выражение SELECT содержит переменные внешнего запроса, оно вычисляется заново при каждом использовании.

Если выражение SELECT является правым операндом оператора IN, и результат его левого операнда совпадает с любым из значений, возвращаемых оператором SELECT, оператор IN возвращает значение TRUE. Для изменения результата проверки на противоположный можно указывать ключевое слово NOT перед оператором IN.

Если выражение SELECT входит в состав выражения, но не является правым операндом оператора IN, первая строка результата используется в качестве значения при вычислении выражения. Если результат SELECT состоит из нескольких строк, все строки, кроме первой, игнорируются. Если результат не содержит ни одной строки, значение SELECT равно NULL.

CAST

Функция CAST приводит выражение к указанному типу данных. В качестве типа можно указывать любое непустое имя, которое является типом столбца, заданным в операторе CREATE TABLE.

Функции

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

Основные функции

По умолчанию доступны следующие основные функции:

abs( X )
Возвращает модуль аргумента X.
coalesce( X, Y, ... )
Возвращает копию первого аргумента, который не равен NULL, или NULL, если все аргументы равны NULL. Эта функция вызывается как минимум с двумя аргументами.
glob( X, Y )
Реализует синтаксис X GLOB Y выражений SQL, поддерживаемых QDB.
hex( X )
Аргумент интерпретируется как объект BLOB. Результатом является шестнадцатеричное представление содержимого этого объекта.
ifnull( X, Y )
Возвращает копию первого аргумента, который не равен NULL, или значение NULL, если оба аргумента равны NULL. Эта функция работает так же, как описанная выше функция coalesce().
last_insert_rowid()
Возвращает идентификатор последней строки, которая была вставлена в базу данных из текущего подключения. Этот же идентификатор возвращается функцией qdb_last_insert_rowid().
length( X )
Возвращает количество символов в строке X.
like( X, Y[, Z] )
Реализует SQL-синтаксис X LIKE Y [ESCAPE Z]. Если задано необязательное условие ESCAPE, пользовательская функция вызывается с тремя аргументами, в противном случае — с двумя аргументами.
lower( X )
Возвращает копию строки X, переведенной в нижний регистр.
ltrim( X[, Y] )
Возвращает строку, которая образуется путем удаления всех символов, содержащихся в Y, из левой части X. Если аргумент Y опущен, из левой части удаляются пробелы.
max( X, Y, ... )
Возвращает аргумент с максимальным значением. В качестве аргументов могут выступать строки и числа. Максимальное значение определяется в соответствии с обычным порядком сортировки. Следует иметь в виду, что max() является обычной функцией, если ей передаются два или более аргументов, но преобразуется в агрегирующую функцию, если указан только один аргумент.
min( X, Y, ... )
Возвращает аргумент с минимальным значением. В качестве аргументов могут выступать строки и числа. Минимальное значение определяется в соответствии с обычным порядком сортировки. Следует иметь в виду, что min() является обычной функцией, если ей передаются два или более аргументов, но преобразуется в агрегирующую функцию, если указан только один аргумент.
nullif( X, Y )
Возвращает первый аргумент, если аргументы не равны, и NULL в противном случае.
quote(X)
Возвращает строку X в формате, подходящем для включения в другой оператор SQL. Строки заключаются в одинарные кавычки; кавычки, которые входят в состав этих строк, предваряются управляющими символами. Объекты BLOB представляются в виде шестнадцатеричных литералов. Эта функция используется в текущей реализации команды VACUUM и также полезна при создании триггеров для отмены/повторения действий.
random( * )
Возвращает случайное целое число в диапазоне от -2147483648 до +2147483647.
randomblob( N )
Возвращает объект BLOB размером N байт с псевдослучайным содержимым. Аргумент N должен быть положительным целым числом.
replace( X, Y, Z )
Возвращает строку, которая образуется путем подстановки строки Z на место каждой подстроки Y в строке X. При сравнениях используется порядок сортировки BINARY.
round( X[, Y] )
Округляет число X до Y цифр после десятичной точки. Если аргумент Y не указан, он считается равным 0.
rtrim( X[, Y] )
Возвращает строку, которая образуется путем удаления всех символов, содержащихся в Y, из левой части X. Если аргумент Y опущен, из левой части удаляются пробелы.
soundex( X )
Вычисляет код soundex строки X. Если аргумент равен NULL, возвращается строка "?000".
sqlite_version()
Возвращает строку с версией используемой библиотеки sqlite.
substr( X, Y, Z )
Возвращает подстроку строки X, которая начинается с Y-го символа и имеет длину Z символов. Крайний левый символ X имеет номер 1. Если Y имеет отрицательное значение, первый символ подстроки отсчитывается с правой, а не с левой, стороны. Поскольку QDB поддерживает кодировку UTF-8, индексы относятся к символам UTF-8, а не к байтам.
trim( X[, Y] )
Возвращает строку, которая образуется путем удаления всех символов, содержащихся в Y, из левой части X. Если аргумент Y опущен, из левой части удаляются пробелы.
typeof( X )
Возвращает тип выражения X: Работа с типами данных QDB рассматривается в главе Типы данных QDB.
upper( X )
Возвращает копию строки X, переведенную в верхний регистр. Поскольку в этой функции используется функция toupper(), строки UTF-8 могут обрабатываться некорректно.

Агрегирующие функции

Если агрегирующая функция принимает единственный аргумент, перед ним можно указывать ключевое слово DISTINCT, которое удаляет из аргумента повторяющиеся значения перед их передачей в функцию. Например, функция count( distinct X ) возвращает количество уникальных значений в столбце, который является результатом вычисления X, а не суммарное количество значений, не равных NULL, в этом столбце.

avg( X )
Возвращает среднее арифметическое значений X, не равных NULL, в группе. Значения строк и объектов BLOB, которые невозможно преобразовать в числа, считаются равными 0. Функция avg() всегда возвращает число с плавающей точкой (даже если все аргументы являются целыми числами).
count( X )
Первый формат этой функции возвращает количество результатов вычисления X, не равных NULL, в группе. Второй формат не принимает аргументов и возвращает суммарное количество строк в группе.
max( X )
Возвращает максимальное из значений X, не равных NULL, в группе. Это значение определяется с применением обычного порядка сортировки.
min( X )
Возвращает минимальное из значений X, не равных NULL, в группе. Это значение определяется с использованием обычного порядка сортировки. Значение NULL возвращается только если все значения группы равны NULL.
sum( X )
total( X )
Возвращают числовую сумму значений X, не равных NULL, в группе. Если все строки или значения, передаваемые в эти функции, равны NULL, функция sum() возвращает NULL, а функция total()0.0. Несмотря на то, что обычно нет смысла присваивать значение NULL сумме пустого множества строк, функция sum() реализована таким образом в большинстве существующих СУБД (в том числе в QDB) согласно требованиям стандарта SQL. Удобным решением этой проблемы языка SQL является функция total(), которая всегда возвращает число с плавающей точкой. Функция sum() возвращает целое число, если все ее аргументы, отличные от NULL, являются целыми числами. Если какой-либо аргумент sum() не является целым числом и не равен NULL, функция sum() возвращает значение с плавающей точкой, которое приблизительно равно фактической сумме ее аргументов.

Функция sum() генерирует исключение, если все аргументы являются целыми числами или NULL, и при вычислении происходит переполнение целочисленного значения. Фукция total() не генерирует никаких исключений.




Предыдущий раздел: перейти