Функции и операторы сравнения#

Операторы сравнения#

Оператор

Описание

<

Меньше

>

Больше

<=

Меньше или равно

>=

Больше или равно

=

Равно

<>

Не равно

!=

Не равно (нестандартный, но популярный синтаксис)

Оператор диапазона: 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

1

1

TRUE

FALSE

FALSE

TRUE

1

2

FALSE

TRUE

TRUE

FALSE

1

NULL

NULL

NULL

TRUE

FALSE

NULL

NULL

NULL

NULL

FALSE

TRUE

GREATEST и LEAST#

Эти функции не входят в стандарт SQL, но являются распространенным расширением. Как и большинство других функций в Trino, они возвращают null, если любой аргумент равен null. Обратите внимание, что в некоторых других базах данных, например PostgreSQL, они возвращают null только если все аргументы равны null.

Поддерживаются следующие типы:

  • DOUBLE

  • BIGINT

  • VARCHAR

  • TIMESTAMP

  • TIMESTAMP WITH TIME ZONE

  • DATE

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

Ниже приведены значения некоторых комбинаций квантификаторов и операторов сравнения:

Выражение

Значение

A = ALL (...)

Вычисляется в true, когда A равно всем значениям.

A <> ALL (...)

Вычисляется в true, когда A не совпадает ни с одним значением.

A < ALL (...)

Вычисляется в true, когда A меньше наименьшего значения.

A = ANY (...)

Вычисляется в true, когда A равно любому из значений. Эта форма эквивалентна A IN (...).

A <> ANY (...)

Вычисляется в true, когда A не совпадает с одним или несколькими значениями.

A < ANY (...)

Вычисляется в true, когда A меньше наибольшего значения.

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';