Литеральные типы
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