Операции сравнения#
Операторы сравнения#
Оператор |
Описание |
---|---|
|
Меньше |
|
Больше |
|
Меньше или равно |
|
Больше или равно |
|
Равно |
|
Не равно |
|
Не равно (альтернативный синтаксис) |
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
);