Spec-Zone.ru › DuckDB

Литеральные типы

DuckDB имеет специальные литеральные типы для представления NULL, целочисленных и строковых литералов в запросах. У них есть собственные правила привязки и преобразования.

До версии DuckDB 0.10.0 целочисленные и строковые литералы вели себя идентично типам INTEGER и VARCHAR.

Литералы NULL

Литерал NULL обозначается ключевым словом NULL. Литерал NULL может быть неявно преобразован в любой другой тип.

Целочисленные литералы

Целочисленные литералы обозначаются как последовательность одной или нескольких цифр. Во время выполнения они приводят к значениям типа INTEGER_LITERAL. Типы INTEGER_LITERAL могут быть неявно преобразованы в любой целочисленный тип, в котором значение помещается. Например, целочисленный литерал 42 может быть неявно преобразован в TINYINT, но целочисленный литерал 1000 — нет.

Другие числовые литералы

Числовые литералы, не являющиеся целыми, могут быть обозначены с помощью десятичной нотации, используя символ точки (.) для разделения целой и дробной части числа. Целая или дробная часть может быть опущена:

SELECT 1.5;          -- 1.5
SELECT .50;          -- 0.5
SELECT 2.;           -- 2.0

Числовые литералы, не являющиеся целыми, также могут быть обозначены с использованием научной записи. В научной записи целочисленный или десятичный литерал следует за экспоненциальной частью, которая обозначается e или E, за которым следует целочисленный литерал, указывающий на показатель степени. Экспоненциальная часть указывает, что предшествующее значение должно быть умножено на 10 в степени показателя:

SELECT 1e2;           -- 100
SELECT 6.02214e23;    -- Avogadro's constant
SELECT 1e-10;         -- 1 ångström

Подчеркивания в числовых литералах

Диалект SQL DuckDB допускает использование символа подчеркивания _ в числовых литералах в качестве необязательного разделителя. Правила использования подчеркиваний следующие:

  • Подчеркивания разрешены в целочисленных, десятичных, шестнадцатеричных и двоичных обозначениях.
  • Подчеркивания не могут быть первым или последним символом в литерале.
  • Подчеркивания должны иметь целочисленную/численную часть с обеих сторон, т. е. не может быть нескольких подчеркиваний подряд и не сразу перед/после десятичной точки или показателя степени.

Примеры:

SELECT 100_000_000;          -- 100000000
SELECT '0xFF_FF'::INTEGER;   -- 65535
SELECT 1_2.1_2E0_1;          -- 121.2
SELECT '0b0_1_0_1'::INTEGER; -- 5

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

Строковые литералы ограничены с помощью одинарных кавычек (', апострофа) и приводят к значениям STRING_LITERAL. Обратите внимание, что двойные кавычки (") не могут использоваться в качестве разделителя строки: вместо этого двойные кавычки используются для ограничения цитируемых идентификаторов.

Неявное конкатенация строковых литералов

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

SELECT 'Hello'
    ' '
    'World' AS greeting;

эквивалентно:

SELECT 'Hello'
    || ' '
    || 'World' AS greeting;

Оба результата следующие:

greeting
Привет Мир

Обратите внимание, что неявное конкатенирование работает только при наличии как минимум одной новой строки между литералами. Использование смежных строковых литералов, разделенных пробелами без новой строки, приводит к синтаксической ошибке:

SELECT 'Hello' ' ' 'World' AS greeting;
Parser Error: syntax error at or near "' '"
LINE 1: SELECT 'Hello' ' ' 'World' AS greeting;
                       ^

Также обратите внимание, что неявное конкатенирование работает только со строковыми литералами в одинарных кавычках и не работает с другими видами строковых значений.

Неявное преобразование строк

Примеры STRING_LITERAL могут быть неявно преобразованы в любой другой тип.

Например, мы можем сравнить строковые литералы с датами:

SELECT d > '1992-01-01' AS result FROM (VALUES (DATE '1992-01-01')) t(d);
результат
false

Однако мы не можем сравнить значения VARCHAR с датами.

SELECT d > '1992-01-01'::VARCHAR FROM (VALUES (DATE '1992-01-01')) t(d);
Binder Error: Cannot compare values of type DATE and type VARCHAR - an explicit cast is required

Экранирование строковых литералов

Для экранирования символа одинарной кавычки (апострофа) в строковом литерале используйте ''. Например, SELECT '''' AS s возвращает '.

Чтобы включить специальные символы, такие как новая строка, используйте E для экранирования строки. Работают как прописные (E'...') , так и строчные варианты (e'...').

SELECT E'Hello\nworld' AS msg;

Или:

SELECT e'Hello\nworld' AS msg;
┌──────────────┐
│     msg      │
│   varchar    │
├──────────────┤
│ Hello\nworld │
└──────────────┘

Поддерживаются следующие экранированные последовательности обратной косой черты:

Последовательность экранирования Имя Код ASCII
\b ввод с возвратной клавиши 8
\f перевод страницы 12
\n новая строка 10
\r возврат каретки 13
\t табуляция 9

Строковые литералы в двойных кавычках

DuckDB поддерживает строковые литералы в двойных кавычках, которые окружены двойными символами доллара ($$):

SELECT $$Hello
world$$ AS msg;
┌──────────────┐
│     msg      │
│   varchar    │
├──────────────┤
│ Hello\nworld │
└──────────────┘
SELECT $$The price is $9.95$$ AS msg;
msg
Цена составляет $9.95

Неявное конкатенирование работает только для строковых литералов в одинарных кавычках, а не в двойных кавычках.

© Copyright 2018–2024 Stichting DuckDB Foundation
Licensed under the MIT License.
https://duckdb.org/docs/sql/data_types/literal_types.html

Spec-Zone.ru

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