Условие WHERE
Условие WHERE позволяет отфильтровать данные, полученные из предложения FROM запроса SELECT.
Если используется условие WHERE, за ним должно следовать выражение типа UInt8.
Строки, для которых это выражение даёт значение 0, исключаются из последующих преобразований или из результата.
Выражение после WHERE часто используется вместе с операторами сравнения и логическими операторами, либо с одной из множества регулярных функций.
Для выражения в WHERE проверяется возможность использования индексов и отсечения партиций, если это поддерживает используемый движок таблицы.
Существует также оптимизация фильтрации под названием PREWHERE.
PREWHERE — это оптимизация для более эффективного применения фильтрации.
Она включена по умолчанию, даже если конструкция PREWHERE явно не указана.
Проверка на NULL
Если вам нужно проверить значение на NULL, используйте:
IS NULLилиisNullIS NOT NULLилиisNotNull
В противном случае выражение с NULL никогда не будет истинным.
Фильтрация данных с помощью логических операторов
Вы можете использовать следующие логические функции в сочетании с предложением WHERE для объединения нескольких условий:
Использование столбцов UInt8 в качестве условия
В ClickHouse столбцы UInt8 могут напрямую использоваться в булевых условиях, где 0 — это false, а любое ненулевое значение (обычно 1) — true.
Пример этого приведён в разделе ниже.
Использование операторов сравнения
Можно использовать следующие операторы сравнения:
| Оператор | Функция | Описание | Пример |
|---|---|---|---|
a = b | equals(a, b) | Равно | price = 100 |
a == b | equals(a, b) | Равно (альтернативный синтаксис) | price == 100 |
a != b | notEquals(a, b) | Не равно | category != 'Electronics' |
a <> b | notEquals(a, b) | Не равно (альтернативный синтаксис) | category <> 'Electronics' |
a < b | less(a, b) | Меньше | price < 200 |
a <= b | lessOrEquals(a, b) | Меньше либо равно | price <= 200 |
a > b | greater(a, b) | Больше | price > 500 |
a >= b | greaterOrEquals(a, b) | Больше либо равно | price >= 500 |
a LIKE s | like(a, b) | Сопоставление с шаблоном (с учётом регистра) | name LIKE '%top%' |
a NOT LIKE s | notLike(a, b) | Несоответствие шаблону (с учётом регистра) | name NOT LIKE '%top%' |
a ILIKE s | ilike(a, b) | Сопоставление с шаблоном (без учёта регистра) | name ILIKE '%LAPTOP%' |
a BETWEEN b AND c | a >= b AND a <= c | Проверка вхождения в диапазон (включительно) | price BETWEEN 100 AND 500 |
a NOT BETWEEN b AND c | a < b OR a > c | Проверка выхода за пределы диапазона | price NOT BETWEEN 100 AND 500 |
Сопоставление по шаблону и условные выражения
Помимо операторов сравнения, в предложении WHERE можно использовать сопоставление по шаблону и условные выражения.
| Feature | Syntax | Case-Sensitive | Performance | Best For |
|---|---|---|---|---|
LIKE | col LIKE '%pattern%' | Yes | Fast | Точное сопоставление с учётом регистра |
ILIKE | col ILIKE '%pattern%' | No | Slower | Поиск без учёта регистра |
if() | if(cond, a, b) | N/A | Fast | Простые бинарные условия |
multiIf() | multiIf(c1, r1, c2, r2, def) | N/A | Fast | Несколько условий |
CASE | CASE WHEN ... THEN ... END | N/A | Fast | Условная логика по стандарту SQL |
См. раздел "Сопоставление по шаблону и условные выражения" с примерами использования.
Выражение с литералами, столбцами или подзапросами
Выражение после оператора WHERE также может включать литералы, столбцы или подзапросы — вложенные операторы SELECT, которые возвращают значения, используемые в условиях.
| Type | Definition | Evaluation | Performance | Example |
|---|---|---|---|---|
| Literal | Фиксированное константное значение | Во время разбора запроса | Самое быстрое | WHERE price > 100 |
| Column | Ссылка на данные таблицы | Для каждой строки | Быстро | WHERE price > cost |
| Subquery | Вложенный SELECT | Во время выполнения запроса | Зависит от подзапроса | WHERE id IN (SELECT ...) |
Вы можете комбинировать литералы, столбцы и подзапросы в сложных условиях:
-- Все три условия с логическими операторами WHERE (price > 100 OR category IN (SELECT category FROM featured)) AND in_stock = true AND name LIKE '%Special%'
Фильтрация данных с помощью логических операторов
Предположим, у нас есть следующая таблица и данные:
1. AND — оба условия должны быть истинными:
2. OR — хотя бы одно из условий должно выполняться:
3. NOT — логическое отрицание условия:
4. XOR — истинным должно быть только одно из условий (но не оба):
5. Сочетание нескольких операторов:
6. Использование функционального синтаксиса:
Синтаксис ключевых слов SQL (AND, OR, NOT, XOR) обычно более удобочитаем, но синтаксис функций может быть полезен в сложных выражениях или при построении динамических запросов.
Использование столбцов UInt8 в качестве условия
Используя таблицу из предыдущего примера, вы можете использовать имя столбца напрямую в качестве условия:
Использование операторов сравнения
В примерах ниже используются таблица и данные из примера выше. Результаты опущены для краткости.
1. Явное сравнение с true (= 1 или = true):
2. Явное сравнение с false (= 0 или = false):
3. Неравенство (!= 0 или != false):
4. Знак «больше»:
5. Меньше или равно:
6. Сочетание с другими условиями:
7. Использование оператора IN:
В примере ниже (1, true) — это кортеж.
Также для этого можно использовать массив:
8. Комбинирование стилей сравнения:
Сопоставление по шаблону и условные выражения
В приведённых ниже примерах используются таблица и данные из примера выше. Результаты опущены для краткости.
Примеры LIKE
Примеры использования ILIKE
Примеры использования IF
Примеры функции multiIf
Примеры конструкции CASE
Простой пример CASE:
CASE с условиями поиска: