Операции сравнения#

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

Оператор

Описание

<

Меньше

>

Больше

<=

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

>=

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

=

Равно

<>

Не равно

!=

Не равно (альтернативный синтаксис)

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 должны быть одного типа, либо приводимы друг к другу.

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 в операторах 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#

Поддерживаемые типы (включая автоматическое приведение типов): DOUBLE, BIGINT, VARCHAR, TIMESTAMP, TIMESTAMP WITH TIME ZONE, DATE.

greatest(value1, value2, ..., valueN) [same as input]#

Возвращает наибольшее из предоставленных значений. Возвращает NULL, если хотя бы один аргументов имеет значение NULL.

least(value1, value2, ..., valueN) [same as input]#

Возвращает наименьшее из предоставленных значений. Возвращает NULL, если хотя бы один аргументов имеет значение NULL.

ALL, ANY и SOME#

Кванторы ALL, ANY и SOME могут быть использованы совместно с операторами сравнения для сравнения значения с одной стороны с несколькими значениями с другой. SOME является псевдонимом ANY.

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 меньше наибольшего значения.

LIKE#

Оператор LIKE можно использовать для сравнения значений с паттерном:

... column [NOT] LIKE 'pattern' ESCAPE 'character';

Сопоставление символов чувствительно к регистру. Шаблон поддерживает два wildcard-символа:

  • _ соответствует любому символу

  • % соответствует нулю, одному или нескольким символам

LIKE часто используют в качестве условия WHERE.

Поиск всех континентов, начинающихся с E. Возвращает Europe:

SELECT * FROM (VALUES 'America', 'Asia', 'Africa', 'Europe', 'Australia', 'Antarctica') AS t (continent)
WHERE continent LIKE 'E%';

Получить все континенты, не начинающиеся с 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';

Wildcard-символы _ и % должны быть экранированы с помощью ключевого слова ESCAPE для их использования в качестве литералов. Следующий запрос возвращает TRUE:

SELECT 'South_America' LIKE 'South\_America' ESCAPE '\';

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

IN#

Оператор IN может быть использован в выражении WHERE для сравнения значения колонки со списком значений. Список значений может быть задан явно или с помощью подзапроса.:

... WHERE column [NOT] IN ('value1','value2');
... WHERE column [NOT] IN ( subquery );

Используйте ключевое слово NOT, чтобы инвертировать результат.

Пример простого IN оператора с явным списком значений:

SELECT * FROM region WHERE name IN ('AMERICA', 'EUROPE');

Данный запрос эквивалентен:

SELECT * FROM region WHERE name = 'AMERICA' OR name = 'EUROPE';

При добавлении NOT мы получим все записи, в которых регион отличен от регионов в списке:

SELECT * FROM region WHERE name NOT IN ('AMERICA', 'EUROPE');

Подзапросы должны возвращать одну колонку с одной или несколькими записями:

SELECT name
FROM nation
WHERE regionkey IN (
    SELECT starts_with(regionkey,"A") AS regionkey
    FROM region
);