Операции сравнения#
Операторы сравнения#
Оператор |
Описание |
|---|---|
|
Меньше |
|
Больше |
|
Меньше или равно |
|
Больше или равно |
|
Равно |
|
Не равно |
|
Не равно (альтернативный синтаксис) |
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 |
|---|---|---|---|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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
Значения некоторых комбинаций кванторов и операторов сравнения:
Выражение |
Описание |
|---|---|
|
Возвращает |
|
Возвращает |
|
Возвращает |
|
Возвращает |
|
Возвращает |
|
Возвращает |
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
);