Функции и операторы сравнения#
Операторы сравнения#
Оператор |
Описание |
|---|---|
|
Меньше |
|
Больше |
|
Меньше или равно |
|
Больше или равно |
|
Равно |
|
Не равно |
|
Не равно (нестандартный, но популярный синтаксис) |
Оператор диапазона: BETWEEN#
Оператор BETWEEN проверяет, находится ли значение в указанном диапазоне.
Он использует синтаксис value BETWEEN min AND max:
SELECT 3 BETWEEN 2 AND 6;
Предыдущее выражение эквивалентно следующему:
SELECT 3 >= 2 AND 3 <= 6;
Чтобы проверить, что значение не попадает в указанный диапазон, используйте
NOT BETWEEN:
SELECT 3 NOT BETWEEN 2 AND 6;
Выражение выше эквивалентно следующему:
SELECT 3 < 2 OR 3 > 6;
NULL в выражении BETWEEN или NOT BETWEEN вычисляется по
стандартным правилам вычисления NULL, примененным к эквивалентному
выражению выше:
SELECT NULL BETWEEN 2 AND 4; -- null
SELECT 2 BETWEEN NULL AND 6; -- null
SELECT 2 BETWEEN 3 AND NULL; -- false
SELECT 8 BETWEEN NULL AND 6; -- false
Операторы BETWEEN и NOT BETWEEN также можно использовать для любого
упорядочиваемого типа. Например, VARCHAR:
SELECT 'Paul' BETWEEN 'John' AND 'Ringo'; -- true
Обратите внимание, что параметры value, min и max для BETWEEN и
NOT BETWEEN должны быть одного типа. Например, Trino выдаст ошибку,
если спросить, находится ли John между 2.3 и 35.2.
IS NULL и IS NOT NULL#
Операторы IS NULL и IS NOT NULL проверяют, является ли значение null
(неопределенным). Оба оператора работают для всех типов данных.
Использование NULL с IS NULL дает true:
SELECT NULL IS NULL; -- true
Но любая другая константа — нет:
SELECT 3.0 IS NULL; -- false
IS DISTINCT FROM и IS NOT DISTINCT FROM#
В SQL значение NULL означает неизвестное значение, поэтому любое сравнение с
NULL дает NULL. Операторы IS DISTINCT FROM и IS NOT DISTINCT FROM
рассматривают NULL как известное значение, и оба оператора гарантируют
результат true или false даже при наличии входных NULL:
SELECT NULL IS DISTINCT FROM NULL; -- false
SELECT NULL IS NOT DISTINCT FROM NULL; -- true
В примере выше значение NULL не считается отличным от NULL.
При сравнении значений, которые могут содержать NULL, используйте эти
операторы, чтобы гарантировать результат TRUE или FALSE.
Следующая таблица истинности показывает обработку NULL в
IS DISTINCT FROM и IS NOT DISTINCT FROM:
a |
b |
a = b |
a <> b |
a DISTINCT b |
a NOT DISTINCT b |
|---|---|---|---|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
GREATEST и LEAST#
Эти функции не входят в стандарт SQL, но являются распространенным расширением. Как и большинство других функций в Trino, они возвращают null, если любой аргумент равен null. Обратите внимание, что в некоторых других базах данных, например PostgreSQL, они возвращают null только если все аргументы равны null.
Поддерживаются следующие типы:
DOUBLEBIGINTVARCHARTIMESTAMPTIMESTAMP WITH TIME ZONEDATE
- greatest(value1, value2, ..., valueN) [same as input]#
Возвращает наибольшее из переданных значений.
- least(value1, value2, ..., valueN) [same as input]#
Возвращает наименьшее из переданных значений.
Квантифицированные предикаты сравнения: ALL, ANY и SOME#
Квантификаторы ALL, ANY и SOME можно использовать вместе с операторами
сравнения следующим образом:
expression operator quantifier ( subquery )
Например:
SELECT 'hello' = ANY (VALUES 'hello', 'world'); -- true
SELECT 21 < ALL (VALUES 19, 20, 21); -- false
SELECT 42 >= SOME (SELECT 41 UNION ALL SELECT 42 UNION ALL SELECT 43); -- true
Ниже приведены значения некоторых комбинаций квантификаторов и операторов сравнения:
Выражение |
Значение |
|---|---|
|
Вычисляется в |
|
Вычисляется в |
|
Вычисляется в |
|
Вычисляется в |
|
Вычисляется в |
|
Вычисляется в |
ANY и SOME имеют одинаковый смысл и могут использоваться
взаимозаменяемо.
Сравнение по шаблону: LIKE#
Оператор LIKE можно использовать для сравнения значений с шаблоном:
... column [NOT] LIKE 'pattern' ESCAPE 'character';
Сопоставление символов чувствительно к регистру, а шаблон поддерживает два символа сопоставления:
_соответствует любому одному символу%соответствует нулю или более символов
Обычно он используется как условие в выражениях WHERE. Например, запрос,
который ищет все континенты, начинающиеся с E, и возвращает Europe:
SELECT * FROM (VALUES 'America', 'Asia', 'Africa', 'Europe', 'Australia', 'Antarctica') AS t (continent)
WHERE continent LIKE 'E%';
Вы можете инвертировать результат, добавив NOT, и получить все остальные
континенты, не начинающиеся с E:
SELECT * FROM (VALUES 'America', 'Asia', 'Africa', 'Europe', 'Australia', 'Antarctica') AS t (continent)
WHERE continent NOT LIKE 'E%';
Если нужно сопоставить только один конкретный символ, можно использовать
символ _ для каждой позиции символа. Следующий запрос использует два
символа подчеркивания и возвращает только Asia:
SELECT * FROM (VALUES 'America', 'Asia', 'Africa', 'Europe', 'Australia', 'Antarctica') AS t (continent)
WHERE continent LIKE 'A__A';
Символы подстановки _ и % должны быть экранированы, чтобы можно было
сопоставлять их как литералы. Это достигается указанием символа ESCAPE:
SELECT 'South_America' LIKE 'South\_America' ESCAPE '\';
Запрос выше возвращает true, так как экранированный символ подчеркивания
совпадает. Если нужно сопоставить сам используемый символ экранирования,
его также можно экранировать.
Если вы хотите сопоставить выбранный символ экранирования, просто экранируйте
его самого. Например, можно использовать \\, чтобы сопоставить \.
Сравнение строк: IN#
Оператор IN можно использовать в предложении WHERE для сравнения значений
столбца со списком значений. Список значений может быть задан подзапросом или
напрямую как статические значения в массиве:
... WHERE column [NOT] IN ('value1','value2');
... WHERE column [NOT] IN ( subquery );
Используйте необязательное ключевое слово NOT, чтобы инвертировать условие.
Следующий пример показывает простое использование со статическим массивом:
SELECT * FROM region WHERE name IN ('AMERICA', 'EUROPE');
Значения в выражении используются для множественных сравнений, которые
объединяются логическим OR. Предыдущий запрос эквивалентен следующему:
SELECT * FROM region WHERE name = 'AMERICA' OR name = 'EUROPE';
Можно инвертировать сравнение, добавив NOT, и получить все остальные
регионы, кроме значений из списка:
SELECT * FROM region WHERE name NOT IN ('AMERICA', 'EUROPE');
При использовании подзапроса для определения значений сравнения подзапрос
должен вернуть один столбец и одну или более строк. Например, следующий
запрос возвращает названия стран из регионов, начинающихся на букву A,
а именно Africa, America и Asia:
SELECT nation.name
FROM nation
WHERE regionkey IN (
SELECT regionkey
FROM region
WHERE starts_with(name, 'A')
)
ORDER by nation.name;
Примеры#
Следующие примеры запросов показывают особенности использования функций и операторов сравнения, связанные с неявным упорядочиванием значений, неявным приведением типов и различными типами.
Упорядочивание:
SELECT 'M' BETWEEN 'A' AND 'Z'; -- true
SELECT 'A' < 'B'; -- true
SELECT 'A' < 'a'; -- true
SELECT TRUE > FALSE; -- true
SELECT 'M' BETWEEN 'A' AND 'Z'; -- true
SELECT 'm' BETWEEN 'A' AND 'Z'; -- false
Следующие запросы показывают тонкое отличие между типами char и varchar.
Параметр длины для varchar — это необязательный параметр максимальной длины,
а сравнение основано только на данных, без учета длины:
SELECT cast('Test' as varchar(20)) = cast('Test' as varchar(25)); --true
SELECT cast('Test' as varchar(20)) = cast('Test ' as varchar(25)); --false
Параметр длины для char задает массив символов фиксированной длины.
Сравнение разных длин автоматически включает приведение к одинаковой,
большей длине. Приведение выполняется как автоматическое дополнение
пробелами, поэтому оба следующих запроса возвращают true:
SELECT cast('Test' as char(20)) = cast('Test' as char(25)); -- true
SELECT cast('Test' as char(20)) = cast('Test ' as char(25)); -- true
Следующие запросы показывают, как упорядочиваются типы date, и как date неявно приводится к timestamp с нулевыми значениями времени:
SELECT DATE '2024-08-22' < DATE '2024-08-31';
SELECT DATE '2024-08-22' < TIMESTAMP '2024-08-22 8:00:00';