Spec-Zone.ru › SQLite

Выражения языка SQL

Содержание
1. Синтаксис
2. Операторы и атрибуты, влияющие на разбор
3. Литералы (константы)
4. Параметры
5. Операторы LIKE, GLOB, REGEXP, MATCH и extract
6. Оператор BETWEEN
7. Выражение CASE
8. Операторы IN и NOT IN
9. Имена столбцов таблицы
10. Оператор EXISTS
11. Выражения подзапросов
12. Коррелированные подзапросы
13. Выражения CAST
14. Логические выражения
15. Функции

1. Синтаксис

expr:

literal-value bind-parameter schema-name . table-name . column-name unary-operator expr expr binary-operator expr function-name ( function-arguments ) filter-clause over-clause ( expr ) , CAST ( expr AS type-name ) expr COLLATE collation-name expr NOT LIKE GLOB REGEXP MATCH expr expr ESCAPE expr expr ISNULL NOTNULL NOT NULL expr IS NOT DISTINCT FROM expr expr
NOT BETWEEN expr AND expr expr NOT IN ( select-stmt ) expr , schema-name . table-function ( expr ) table-name , NOT EXISTS ( select-stmt ) CASE expr WHEN expr THEN expr ELSE expr END raise-function

filter-clause:

FILTER ( WHERE expr )

function-arguments:

DISTINCT expr , * ORDER BY ordering-term ,

ordering-term:

expr COLLATE collation-name DESC ASC NULLS FIRST NULLS LAST

literal-value:

CURRENT_TIMESTAMP numeric-literal string-literal blob-literal NULL TRUE FALSE CURRENT_TIME CURRENT_DATE

over-clause:

OVER window-name ( base-window-name PARTITION BY expr , ORDER BY ordering-term , frame-spec )

frame-spec:

GROUPS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING RANGE ROWS UNBOUNDED PRECEDING expr PRECEDING CURRENT ROW expr PRECEDING CURRENT ROW expr FOLLOWING expr PRECEDING CURRENT ROW expr FOLLOWING EXCLUDE CURRENT ROW EXCLUDE GROUP EXCLUDE TIES EXCLUDE NO OTHERS

ordering-term:

expr COLLATE collation-name DESC ASC NULLS FIRST NULLS LAST

raise-function:

RAISE ( ROLLBACK , expr ) IGNORE ABORT FAIL

select-stmt:

WITH RECURSIVE common-table-expression , SELECT DISTINCT result-column , ALL FROM table-or-subquery join-clause , WHERE expr GROUP BY expr HAVING expr , WINDOW window-name AS window-defn , VALUES ( expr ) , , compound-operator select-core ORDER BY LIMIT expr ordering-term , OFFSET expr , expr

common-table-expression:

table-name ( column-name ) AS NOT MATERIALIZED ( select-stmt ) ,

compound-operator:

UNION UNION INTERSECT EXCEPT ALL

join-clause:

table-or-subquery join-operator table-or-subquery join-constraint

join-constraint:

USING ( column-name ) , ON expr

join-operator:

NATURAL LEFT OUTER JOIN , RIGHT FULL INNER CROSS

ordering-term:

expr COLLATE collation-name DESC ASC NULLS FIRST NULLS LAST

result-column:

expr AS column-alias * table-name . *

table-or-subquery:

schema-name . table-name AS table-alias INDEXED BY index-name NOT INDEXED table-function-name ( expr ) , AS table-alias ( select-stmt ) ( table-or-subquery ) , join-clause

window-defn:

( base-window-name PARTITION BY expr , ORDER BY ordering-term , frame-spec )

frame-spec:

GROUPS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING RANGE ROWS UNBOUNDED PRECEDING expr PRECEDING CURRENT ROW expr PRECEDING CURRENT ROW expr FOLLOWING expr PRECEDING CURRENT ROW expr FOLLOWING EXCLUDE CURRENT ROW EXCLUDE GROUP EXCLUDE TIES EXCLUDE NO OTHERS

type-name:

name ( signed-number , signed-number ) ( signed-number )

signed-number:

+ numeric-literal -

2. Операторы и атрибуты, влияющие на разбор

SQLite поддерживает перечисленные ниже операторы, расположенные в порядке приоритета1
(сверху вниз — от наивысшего к наименьшему):

Операторы 2 ~ &lsqb;expr&rsqb; + &lsqb;expr&rsqb; - &lsqb;expr&rsqb; &lsqb;expr&rsqb; COLLATE &lpar;collation-name&rpar; 3 || -> ->> * / % + - & | << >> &lsqb;expr&rsqb; ESCAPE &lsqb;escape-character-expr&rsqb; 4 < > <= >= = == <> != IS IS NOT
IS DISTINCT FROM IS NOT DISTINCT FROM
&lsqb;expr&rsqb; BETWEEN5 &lsqb;expr&rsqb; AND &lsqb;expr&rsqb;
IN5 MATCH5 LIKE5 REGEXP5 GLOB5
&lsqb;expr&rsqb; ISNULL &lsqb;expr&rsqb; NOTNULL &lsqb;expr&rsqb; NOT NULL NOT &lsqb;expr&rsqb; AND OR

  1. Операторы, указанные в одной ячейке таблицы, имеют одинаковый приоритет.
  2. «&lsqb;expr&rsqb;» обозначает места операндов для небинарных операторов.
    Операторы без дополнения «&lsqb;expr&rsqb;» являются бинарными и левоассоциативными.
  3. Предложение COLLATE (с именем последовательности сортировки) действует как единый постфиксный оператор.
  4. Предложение ESCAPE (с символом escape) действует как единый постфиксный оператор.
    Оно может применяться только к предшествующему выражению &lsqb;expr&rsqb; LIKE &lsqb;expr&rsqb;.
  5. Перед каждым ключевым словом из набора (BETWEEN IN GLOB LIKE MATCH REGEXP) можно поставить NOT, при этом сохраняются приоритет и ассоциативность соответствующего оператора без NOT.

Оператор COLLATE — это унарный постфиксный оператор, который назначает выражению последовательность сортировки. Последовательность сортировки, заданная оператором COLLATE, переопределяет последовательность сортировки, определённую предложением COLLATE в определении столбца таблицы. Дополнительные сведения см. в документе «Типы данных в SQLite3», в подробном описании последовательностей сортировки.

Унарный оператор + ничего не делает. Его можно применять к строкам, числам, BLOB-объектам или NULL; он всегда возвращает значение, совпадающее со значением операнда.

Обратите внимание, что существуют два варианта операторов равенства и неравенства. Для равенства можно использовать = или ==. Для неравенства можно использовать != или <>. Оператор || означает «конкатенацию» — он объединяет две строки своих операндов. Операторы -> и ->> выполняют извлечение: они извлекают компонент RHS из LHS. Пример см. в разделе извлечение подкомпонентов JSON.

Оператор % приводит типы обоих операндов к INTEGER, а затем вычисляет остаток от деления левого целого числа на правое. Остальные арифметические операторы выполняют целочисленную арифметику, если оба операнда являются целыми числами и результат не вызывает переполнения; в противном случае выполняется арифметика с плавающей точкой согласно стандарту IEEE 754, если хотя бы один операнд является вещественным числом или целочисленная арифметика привела бы к переполнению. Целочисленное деление возвращает целочисленный результат, округлённый к нулю.

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

Все операторы обычно возвращают NULL, если любой из операндов равен NULL, за исключением случаев, указанных ниже. Это соответствует стандарту SQL92.

Если один из операндов равен NULL:
AND возвращает 0 (ложь), если другой операнд имеет значение false; и
OR возвращает 1 (истина), если другой операнд имеет значение true.

Операторы IS и IS NOT работают подобно = и !=, за исключением случаев, когда один или оба операнда равны NULL. Если оба операнда равны NULL, оператор IS возвращает 1 (истина), а оператор IS NOT — 0 (ложь). Если один операнд равен NULL, а другой нет, оператор IS возвращает 0 (ложь), а оператор IS NOT — 1 (истина). Выражение IS или IS NOT не может возвращать NULL.

Оператор IS NOT DISTINCT FROM — это альтернативная запись оператора IS. Аналогично, оператор IS DISTINCT FROM означает то же, что и IS NOT. Стандартный SQL не поддерживает краткую запись IS и IS NOT. Эти краткие формы являются расширением SQLite. В большинстве других СУБД SQL необходимо использовать менее удобочитаемые операторы IS NOT DISTINCT FROM и IS DISTINCT FROM.

3. Литеральные значения (константы)

Литеральное значение представляет собой константу. Литеральными значениями могут быть целые числа, числа с плавающей точкой, строки, BLOB-объекты или NULL.

Синтаксис целочисленных литералов и литералов с плавающей точкой (совместно называемых «числовыми литералами») показан на следующей диаграмме:

numeric-literal:

digit _ . E e digit _ . digit _ - digit _ + 0x 0X hexdigit _

Если числовой литерал содержит десятичную точку или показатель степени, либо его значение меньше -9223372036854775808 или больше 9223372036854775807, он является литералом с плавающей точкой. В противном случае это целочисленный литерал. Символ «E», с которого начинается показатель степени в литерале с плавающей точкой, может быть как прописным, так и строчным. В качестве десятичного разделителя всегда используется символ «.», даже если в региональных настройках для этой цели задана запятая «,»: использование запятой в качестве десятичного разделителя привело бы к синтаксической неоднозначности.

Начиная с SQLite версии 3.46.0 (2024-05-23), между любыми двумя цифрами можно добавить один символ подчёркивания («_»). Подчёркивания используются исключительно для удобства чтения и игнорируются SQLite.

Шестнадцатеричные целочисленные литералы записываются в соответствии с нотацией языка C: «0x» или «0X», за которыми следуют шестнадцатеричные цифры. Например, 0x1234 означает то же, что и 4660, а 0x8000000000000000 — то же, что и -9223372036854775808. Шестнадцатеричные целочисленные литералы интерпретируются как 64-битные целые числа в дополнительном коде и поэтому ограничены шестнадцатью значащими цифрами. Поддержка шестнадцатеричных целых чисел появилась в SQLite версии 3.8.6 (2014-08-15). Для обеспечения обратной совместимости шестнадцатеричная запись целых чисел «0x» распознаётся только парсером языка SQL, но не процедурами преобразования типов. Строковые переменные, содержащие текст в формате шестнадцатеричных целых чисел, не интерпретируются как шестнадцатеричные целые числа при приведении строкового значения к целому числу с помощью выражения CAST, при преобразовании в соответствии с аффинностью столбца, перед выполнением числовой операции или при любом другом преобразовании во время выполнения. При приведении строкового значения в формате шестнадцатеричного целого числа к целому числу процесс преобразования останавливается при встрече символа «x», поэтому результирующее целое число всегда равно нулю. SQLite распознаёт шестнадцатеричную запись целых чисел только в тексте инструкции SQL, но не в содержимом базы данных.

Строковая константа образуется заключением строки в одинарные кавычки ('). Одинарную кавычку внутри строки можно записать двумя одинарными кавычками подряд — как в Pascal. Экранирование в стиле C с помощью символа обратной косой черты не поддерживается, поскольку оно не является частью стандарта SQL.

Литералы BLOB — это строковые литералы, содержащие шестнадцатеричные данные и предваряемые одним символом «x» или «X». Пример: X'53514C697465'

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

4. Параметры

Токен «переменная» или «параметр» обозначает заполнитель в выражении для значения, которое подставляется во время выполнения с помощью семейства интерфейсов C/C++ sqlite3_bind(). Параметры могут иметь несколько форм:

   
?NNN

 A question mark followed by a number NNN holds a spot for the NNN-th parameter. NNN must be between 1 and SQLITE_MAX_VARIABLE_NUMBER.    ?
 A question mark that is not followed by a number creates a parameter with a number one greater than the largest parameter number already assigned. If this means the parameter number is greater than SQLITE_MAX_VARIABLE_NUMBER, it is an error. This parameter format is provided for compatibility with other database engines. But because it is easy to miscount the question marks, the use of this parameter format is discouraged. Programmers are encouraged to use one of the symbolic formats below or the ?NNN format above instead.    
:AAAA

 A colon followed by an identifier name holds a spot for a named parameter with the name :AAAA. Named parameters are also numbered. The number assigned is one greater than the largest parameter number already assigned. If this means the parameter would be assigned a number greater than SQLITE_MAX_VARIABLE_NUMBER, it is an error. To avoid confusion, it is best to avoid mixing named and numbered parameters.   
@AAAA

 An "at" sign works exactly like a colon, except that the name of the parameter created is @AAAA.   
$AAAA

 A dollar-sign followed by an identifier name also holds a spot for a named parameter with the name $AAAA. The identifier name in this case can include one or more occurrences of "::" and a suffix enclosed in "(...)" containing any text at all. This syntax is the form of a variable name in the Tcl programming language. The presence of this syntax results from the fact that SQLite is really a Tcl extension that has escaped into the wild.   

Параметрам, которым не назначены значения с помощью sqlite3_bind(), присваивается значение NULL. Интерфейс sqlite3_bind_parameter_index() можно использовать для преобразования символьного имени параметра в соответствующий ему числовой индекс.

Максимальный номер параметра задаётся во время компиляции макросом SQLITE_MAX_VARIABLE_NUMBER. Отдельное подключение к базе данных D может уменьшить максимальный номер параметра ниже максимума, заданного во время компиляции, с помощью интерфейса sqlite3_limit(D, SQLITE_LIMIT_VARIABLE_NUMBER,...).

5. Операторы LIKE, GLOB, REGEXP, MATCH и извлечения

Оператор LIKE выполняет сопоставление с образцом. Правый операнд оператора LIKE содержит образец, а левый — строку, которую нужно сопоставить с образцом. Знак процента («%») в образце LIKE соответствует любой последовательности из нуля или более символов в строке. Символ подчёркивания («_») в образце LIKE соответствует любому одному символу в строке. Любой другой символ соответствует самому себе или своему эквиваленту в нижнем/верхнем регистре (то есть сопоставление не учитывает регистр). Важное примечание: По умолчанию SQLite распознаёт различия между верхним и нижним регистром только для символов ASCII. По умолчанию оператор LIKE чувствителен к регистру для символов Unicode за пределами диапазона ASCII. Например, выражение 'a' LIKE 'A' имеет значение TRUE, а 'æ' LIKE 'Æ' — FALSE. Расширение ICU для SQLite включает улучшенную версию оператора LIKE, которая выполняет смену регистра для всех символов Unicode.

Если указано необязательное предложение ESCAPE, выражение после ключевого слова ESCAPE должно иметь значение строки, состоящей из одного символа. Этот символ можно использовать в образце LIKE, чтобы включать буквальные символы процента или подчёркивания. Символ экранирования, за которым следует знак процента (%), подчёркивание (_) или ещё один такой же символ экранирования, соответствует соответственно буквальному знаку процента, подчёркиванию или одному символу экранирования.

Инфиксный оператор LIKE реализуется вызовом определённых приложением функций SQL like(Y,X) или like(Y,X,Z).

Оператор LIKE можно сделать чувствительным к регистру с помощью прагмы case_sensitive_like.

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

Оператор REGEXP — это особый синтаксис для пользовательской функции regexp(). По умолчанию функция regexp() не определена, поэтому использование оператора REGEXP обычно приводит к сообщению об ошибке. Если во время выполнения добавить определённую приложением функцию SQL с именем «regexp», оператор «X REGEXP Y» будет реализован как вызов «regexp(Y,X)».

Оператор MATCH — это особый синтаксис для определённой приложением функции match(). Реализация функции match() по умолчанию вызывает исключение и практически бесполезна. Однако расширения могут переопределить функцию match(), добавив более полезную логику.

Операторы извлечения представляют собой особый синтаксис для функций «->»() и «->>»(). Реализации этих функций по умолчанию выполняют извлечение компонентов JSON, однако расширения могут переопределить их для других целей.

6. Оператор BETWEEN

Оператор BETWEEN логически эквивалентен паре сравнений. «x BETWEEN y AND z» эквивалентно «x>=y AND x<=z», за исключением того, что при использовании BETWEEN выражение x вычисляется только один раз.

7. Выражение CASE

Выражение CASE выполняет функцию, аналогичную IF-THEN-ELSE в других языках программирования.

Необязательное выражение между ключевым словом CASE и первым ключевым словом WHEN называется базовым выражением. Существует две основные формы выражения CASE: с базовым выражением и без него.

В выражении CASE без базового выражения каждое выражение WHEN вычисляется, а полученный результат рассматривается как логическое значение; вычисление начинается с самого левого выражения и продолжается вправо. Результатом выражения CASE становится вычисленное выражение THEN, соответствующее первому выражению WHEN, результат которого равен true. Если ни одно из выражений WHEN не даёт true, результатом становится вычисленное выражение ELSE, если оно есть. Если выражение ELSE отсутствует и ни одно из выражений WHEN не даёт true, общий результат равен NULL.

При вычислении условий WHEN результат NULL считается ложным.

В выражении CASE с базовым выражением базовое выражение вычисляется только один раз, а его результат сравнивается с результатами вычисления каждого выражения WHEN слева направо. Результатом выражения CASE становится вычисленное выражение THEN, соответствующее первому выражению WHEN, для которого сравнение даёт true. Если ни одно из выражений WHEN не даёт значение, равное базовому выражению, результатом становится вычисленное выражение ELSE, если оно есть. Если выражение ELSE отсутствует и ни одно из выражений WHEN не даёт результат, равный базовому выражению, общий результат равен NULL.

При сравнении базового выражения с выражением WHEN применяются те же правила последовательности сортировки, аффинности и обработки NULL, что и в случае, когда базовое выражение и выражение WHEN являются соответственно левым и правым операндами оператора =.

Если базовое выражение равно NULL, результатом CASE всегда будет результат вычисления выражения ELSE, если оно есть, или NULL, если его нет.

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

Единственное различие между следующими двумя выражениями CASE заключается в том, что в первом примере выражение x вычисляется ровно один раз, а во втором может вычисляться несколько раз:

    
    
  • CASE x WHEN w1 THEN r1 WHEN w2 THEN r2 ELSE r3 END
  • CASE WHEN x=w1 THEN r1 WHEN x=w2 THEN r2 ELSE r3 END
  • Встроенная функция SQL iif(x,y,z) логически эквивалентна выражению «CASE WHEN x THEN y ELSE z END». Функция iif() используется в SQL Server и включена в SQLite для обеспечения совместимости. Некоторые разработчики предпочитают функцию iif(), поскольку она лаконичнее.

    8. Операторы IN и NOT IN

    Операторы IN и NOT IN принимают выражение слева и список значений или подзапрос справа. Если правый операнд оператора IN или NOT IN — это подзапрос, число столбцов в нём должно совпадать с числом столбцов в значении строки левого операнда. Если левое выражение не является выражением значения строки, подзапрос справа от оператора IN или NOT IN должен быть скалярным. Если правый операнд оператора IN или NOT IN — это список значений, каждое из этих значений должно быть скалярным, а левое выражение также должно быть скалярным. Правой частью оператора IN или NOT IN может быть имя таблицы или имя табличной функции; в этом случае правая часть рассматривается как подзапрос вида «(SELECT * FROM name)». Если правый операнд — пустое множество, результат IN равен false, а результат NOT IN равен true независимо от левого операнда, даже если левый операнд равен NULL.

    Результат оператора IN или NOT IN определяется следующей таблицей:

    Левый операнд
    равен NULL
    Правый операнд
    содержит NULL
    Правый операнд
    является пустым множеством
    Левый операнд найден
    в правом операнде
    Результат
    оператора IN
    Результат
    оператора NOT IN
    нет нет нет нет false true
    не имеет значения нет да нет false true
    нет не имеет значения нет да true false
    нет да нет нет NULL NULL
    да не имеет значения нет не имеет значения NULL NULL

    Обратите внимание: SQLite допускает пустой список скалярных значений в скобках справа от оператора IN или NOT IN, однако большинство других систем управления базами данных SQL и стандарт SQL92 требуют, чтобы список содержал хотя бы один элемент.

    9. Имена столбцов таблицы

    Именем столбца может быть любое имя, определённое в инструкции CREATE TABLE, либо один из следующих специальных идентификаторов: «ROWID», «OID» или «_ROWID_». Эти три специальных идентификатора обозначают уникальный целочисленный ключ (rowid), связанный с каждой строкой каждой таблицы, поэтому они недоступны в таблицах WITHOUT ROWID. Специальные идентификаторы обозначают ключ строки только в том случае, если инструкция CREATE TABLE не определяет реальный столбец с таким же именем. rowid можно использовать везде, где можно использовать обычный столбец.

    10. Оператор EXISTS

    Оператор EXISTS всегда принимает одно из целочисленных значений 0 и 1. Если выполнение инструкции SELECT, указанной в качестве правого операнда оператора EXISTS, возвращает одну или несколько строк, результат оператора EXISTS равен 1. Если выполнение SELECT не возвращает ни одной строки, результат оператора EXISTS равен 0.

    Число столбцов в каждой возвращённой инструкцией SELECT строке (если таковые есть) и конкретные возвращаемые значения не влияют на результат оператора EXISTS. В частности, строки, содержащие значения NULL, обрабатываются так же, как строки без значений NULL.

    11. Выражения-подзапросы

    Инструкция SELECT, заключённая в скобки, является подзапросом. В качестве скалярных подзапросов допускаются все типы инструкций SELECT, включая агрегатные и составные запросы SELECT (запросы с ключевыми словами UNION или EXCEPT). Значением выражения-подзапроса является первая строка результата заключённой в скобки инструкции SELECT. Если заключённая в скобки инструкция SELECT не возвращает строк, значением выражения-подзапроса является NULL.

    Подзапрос, возвращающий один столбец, является скалярным и может использоваться практически в любом месте. Подзапрос, возвращающий два или более столбцов, является подзапросом значения строки и может использоваться только как операнд оператора сравнения или в качестве значения в предложении UPDATE SET, если список имён столбцов имеет тот же размер.

    12. Коррелированные подзапросы

    Инструкция SELECT, используемая как скалярный подзапрос или как правый операнд выражения IN, NOT IN либо EXISTS, может содержать ссылки на столбцы внешнего запроса. Такой подзапрос называется коррелированным. Коррелированный подзапрос вычисляется заново каждый раз, когда требуется его результат. Некоррелированный подзапрос вычисляется только один раз, а его результат повторно используется по мере необходимости.

    13. Выражения CAST

    Выражение CAST вида «CAST(expr AS type-name)» используется для преобразования значения expr в другой класс хранения, заданный параметром type-name. Преобразование CAST похоже на преобразование, выполняемое при применении к значению аффинности столбца, однако с оператором CAST преобразование выполняется всегда, даже если оно приводит к потере данных и необратимо. Аффинность столбца меняет тип данных значения только тогда, когда преобразование не приводит к потере данных и является обратимым.

    Если значение expr равно NULL, результат выражения CAST также равен NULL. В противном случае класс хранения результата определяется применением правил определения аффинности столбца к параметру type-name.

    Аффинность type-name Выполнение преобразования
    NONE Приведение значения к type-name без аффинности приводит к преобразованию значения в BLOB. Преобразование в BLOB состоит в том, что сначала значение приводится к TEXT в кодировке подключения к базе данных, а затем полученная последовательность байтов интерпретируется как BLOB, а не как TEXT.
    TEXT При приведении значения BLOB к TEXT последовательность байтов, составляющая BLOB, интерпретируется как текст, закодированный с использованием кодировки базы данных.

    При приведении значения INTEGER или REAL к TEXT значение форматируется так же, как при вызове sqlite3_snprintf(), за исключением того, что результирующий TEXT использует кодировку подключения к базе данных.

    REAL При приведении значения BLOB к REAL значение сначала преобразуется в TEXT.

    При приведении значения TEXT к REAL из него извлекается максимально длинный префикс, который можно интерпретировать как вещественное число; оставшаяся часть игнорируется. При преобразовании TEXT в REAL начальные пробелы в значении TEXT игнорируются. Если префикса, который можно интерпретировать как вещественное число, нет, результат преобразования равен 0.0.

    INTEGER При приведении значения BLOB к INTEGER значение сначала преобразуется в TEXT.

    При приведении значения TEXT к INTEGER из него извлекается максимально длинный префикс, который можно интерпретировать как целое число; оставшаяся часть игнорируется. При преобразовании TEXT в INTEGER начальные пробелы в значении TEXT игнорируются. Если префикса, который можно интерпретировать как целое число, нет, результат преобразования равен 0. Если целое число в префиксе больше +9223372036854775807, результат приведения точно равен +9223372036854775807. Аналогично, если целое число в префиксе меньше -9223372036854775808, результат приведения точно равен -9223372036854775808.

    При приведении к INTEGER, если текст похож на число с плавающей точкой и экспонентой, экспонента игнорируется, поскольку она не входит в целочисленный префикс. Например, результатом «CAST('123e+5' AS INTEGER)» будет 123, а не 12300000.

    Оператор CAST распознаёт только десятичные целые числа — преобразование шестнадцатеричных целых чисел останавливается на символе «x» в префиксе «0x» строки с шестнадцатеричным целым числом, поэтому результат CAST всегда равен нулю.

    Приведение значения REAL к INTEGER даёт целое число между значением REAL и нулём, ближайшее к значению REAL. Если значение REAL больше наибольшего возможного знакового целого числа (+9223372036854775807), результатом будет наибольшее возможное знаковое целое число. Если значение REAL меньше наименьшего возможного знакового целого числа (-9223372036854775808), результатом будет наименьшее возможное знаковое целое число.

    До выхода SQLite версии 3.8.2 (2013-12-06) при приведении значения REAL, превышающего +9223372036854775807.0, к целому числу результатом было наименьшее отрицательное целое число -9223372036854775808. Такое поведение было предназначено для имитации поведения оборудования x86/x64 при выполнении аналогичного приведения.

    NUMERIC Приведение значения TEXT или BLOB к NUMERIC даёт результат типа INTEGER или REAL. Если входной текст похож на целое число (не содержит десятичной точки и экспоненты), а значение достаточно мало, чтобы поместиться в 64-битное знаковое целое число, результат будет иметь тип INTEGER. Если входной текст похож на число с плавающей точкой (содержит десятичную точку и/или экспоненту) и описывает значение, которое можно без потерь преобразовать в 64-битное число с плавающей точкой IEEE 754 и обратно в 51-битное знаковое целое число, результат будет иметь тип INTEGER. (В предыдущем предложении указано 51-битное целое число, поскольку оно на один бит короче мантиссы 64-битного числа с плавающей точкой IEEE 754 и, следовательно, обеспечивает запас в 1 бит для преобразования текста в число с плавающей точкой.) Любой входной текст, описывающий значение за пределами диапазона 64-битного знакового целого числа, даёт результат типа REAL.

    Приведение значения REAL или INTEGER к NUMERIC не выполняет никаких действий, даже если значение REAL можно без потерь преобразовать в целое число.

    Обратите внимание: результат приведения любого значения, не относящегося к BLOB, к BLOB и результат приведения любого значения BLOB к значению, не относящемуся к BLOB, могут различаться в зависимости от того, использует ли база данных кодировку UTF-8, UTF-16be или UTF-16le.

    14. Логические выражения

    В языке SQL есть несколько контекстов, в которых вычисляется выражение, а результат преобразуется в логическое значение (true или false). К ним относятся:

    • предложение WHERE инструкции SELECT, UPDATE или DELETE;
    • предложение ON или USING соединения в инструкции SELECT;
    • предложение HAVING инструкции SELECT;
    • предложение WHEN триггера SQL;
    • предложение WHEN или предложения WHEN некоторых выражений CASE.

    Чтобы преобразовать результат выражения SQL в логическое значение, SQLite сначала приводит результат к значению NUMERIC так же, как при использовании выражения CAST. Числовое значение, равное нулю (целое значение 0 или вещественное значение 0.0), считается ложным. Значение NULL остаётся NULL. Все остальные значения считаются истинными.

    Например, значения NULL, 0.0, 0, 'english' и '0' считаются ложными. Значения 1, 1.0, 0.1, -0.1 и '1english' считаются истинными.

    Начиная с SQLite 3.23.0 (2018-04-02), SQLite распознаёт идентификаторы «TRUE» и «FALSE» как логические литералы, если и только если эти идентификаторы уже не используются в каком-либо другом значении. Если столбцы, таблицы или другие объекты с именами TRUE или FALSE уже существуют, то для обеспечения обратной совместимости идентификаторы TRUE и FALSE будут ссылаться на эти объекты, а не на логические значения.

    Логические идентификаторы TRUE и FALSE обычно являются просто псевдонимами целочисленных значений 1 и 0 соответственно. Однако, если TRUE или FALSE стоят справа от оператора IS, оператор IS вычисляет левый операнд как логическое значение и возвращает соответствующий результат.

    15. Функции

    SQLite поддерживает множество простых, агрегатных и оконных функций SQL. Для удобства представления простые функции подразделяются на основные функции, функции даты и времени, математические функции и функции JSON. Приложения могут добавлять новые функции, написанные на C/C++, с помощью интерфейса sqlite3_create_function().

    На приведённой выше основной диаграмме синтаксиса выражений показан единый синтаксис для всех вызовов функций. Это сделано лишь для упрощения диаграммы синтаксиса выражений. На самом деле синтаксис каждого типа функции немного различается, как показано ниже. Синтаксис вызова функции на основной диаграмме синтаксиса выражений объединяет три синтаксиса, представленных здесь:

    вызов-простой-функции:

    simple-func ( expr ) , *

    вызов-агрегатной-функции:

    aggregate-func ( DISTINCT expr ) filter-clause , * ORDER BY ordering-term ,

    window-function-invocation:

    window-func ( expr ) filter-clause OVER window-name window-defn , *

    Предложение OVER обязательно для оконных функций и запрещено в остальных случаях. Ключевое слово DISTINCT и предложение ORDER BY разрешены только в агрегатных функциях. Предложение FILTER не может использоваться с простой функцией.

    Агрегатная функция может иметь то же имя, что и простая функция, если количество аргументов у двух вариантов этой функции различается. Например, функция max() с одним аргументом является агрегатной, а функция max() с двумя или более аргументами является простой функцией. Агрегатные функции обычно также можно использовать как оконные функции.

    Последнее обновление этой страницы: 2025-05-31 13:08:22Z

    SQLite is in the Public Domain.
    https://sqlite.org/lang_expr.html

    Spec-Zone.ru

    Настройки Оффлайн Что нового Помощь О нас
    Spec-Zone .ru
    спецификации, руководства, описания, API