WHERE позволяет фильтровать данные, поступающие из предложения FROM оператора SELECT.
Если есть предложение WHERE, за ним должно следовать выражение типа UInt8.
Строки, для которых это выражение вычисляется в 0, исключаются из дальнейших преобразований или из результата.
Выражение после предложения WHERE часто используется с операторами сравнения и логическими операторами, а также с одной из множества обычных функций.
При вычислении выражения WHERE могут использоваться индексы и отсечение партиций, если базовый движок таблицы это поддерживает.
PREWHEREСуществует также оптимизация фильтрации под названием
PREWHERE.
PREWHERE — это оптимизация, которая позволяет применять фильтрацию более эффективно.
Она включена по умолчанию, даже если предложение PREWHERE явно не указано.Проверка на NULL
NULL, используйте:
IS NULLилиisNullIS NOT NULLилиisNotNull
NULL никогда не будет истинным.
Фильтрация данных с помощью логических операторов
WHERE, чтобы объединять несколько условий:
Использование столбцов UInt8 в качестве условия
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 можно использовать сопоставление с шаблоном и условные выражения.
| Возможность | Синтаксис | С учетом регистра | Производительность | Лучше всего подходит для |
|---|---|---|---|---|
LIKE | col LIKE '%pattern%' | Да | Быстро | Сопоставления с шаблоном с учетом регистра |
ILIKE | col ILIKE '%pattern%' | Нет | Медленнее | Регистронезависимого поиска |
if() | if(cond, a, b) | Н/Д | Быстро | Простых бинарных условий |
multiIf() | multiIf(c1, r1, c2, r2, def) | Н/Д | Быстро | Нескольких условий |
CASE | CASE WHEN ... THEN ... END | Н/Д | Быстро | Условной логики в стандартном SQL |
Выражение с литералами, столбцами или подзапросами
WHERE также может включать литералы, столбцы или подзапросы — вложенные операторы SELECT, которые возвращают значения для использования в условиях.
| Тип | Определение | Вычисление | Производительность | Пример |
|---|---|---|---|---|
| Литерал | Фиксированное значение | В момент записи запроса | Самая высокая | WHERE price > 100 |
| Столбец | Ссылка на данные таблицы | Для каждой строки | Высокая | WHERE price > cost |
| Подзапрос | Вложенный SELECT | Во время выполнения запроса | Зависит от случая | WHERE id IN (SELECT ...) |
Примеры
Проверка значения NULL
NULL:
Фильтрация данных с помощью логических операторов
AND — оба условия должны быть истинны:
OR — хотя бы одно из условий должно выполняться:
NOT — отрицает условие:
XOR — должно быть истинным ровно одно условие (но не оба сразу):
AND, OR, NOT, XOR) обычно более удобочитаем, но синтаксис функций может быть полезен в сложных выражениях или при построении динамических запросов.
Использование столбцов UInt8 в качестве условия
Использование операторов сравнения
= 1 или = true):
= 0 or = false):
!= 0 или != false):
IN:
В примере ниже (1, true) — кортеж.