A cláusula WHERE permite filtrar os dados que vêm da cláusulaFROM de SELECT.
Se houver uma cláusula WHERE, ela deve ser seguida de uma expressão do tipo UInt8.
As linhas para as quais essa expressão resulta em 0 são excluídas de transformações posteriores ou do resultado.
A expressão que segue a cláusula WHERE costuma ser usada com operadores de comparação e operadores lógicos, ou com uma das muitas funções regulares.
A expressão na cláusula WHERE é avaliada considerando a possibilidade de usar índices e poda de partições, se o engine de tabela subjacente oferecer suporte a isso.
Verificar NULL
Se você precisar testar se um valor é NULL, use:
IS NULLouisNullIS NOT NULLouisNotNull
Caso contrário, uma expressão com NULL nunca será avaliada como verdadeira.
Filtrando dados com operadores lógicos
Você pode usar as seguintes funções lógicas em conjunto com a cláusula WHERE para combinar várias condições:
Usando colunas UInt8 como condição
No ClickHouse, colunas UInt8 podem ser usadas diretamente como condições booleanas, em que 0 é false e qualquer valor diferente de zero (geralmente 1) é true.
Um exemplo disso é mostrado na seção abaixo.
Usando operadores de comparação
Os seguintes operadores de comparação podem ser usados:
| Operador | Função | Descrição | Exemplo |
|---|---|---|---|
a = b |
equals(a, b) |
Igual a | price = 100 |
a == b |
equals(a, b) |
Igual a (sintaxe alternativa) | price == 100 |
a != b |
notEquals(a, b) |
Diferente de | category != 'Electronics' |
a <> b |
notEquals(a, b) |
Diferente de (sintaxe alternativa) | category <> 'Electronics' |
a < b |
less(a, b) |
Menor que | price < 200 |
a <= b |
lessOrEquals(a, b) |
Menor que ou igual a | price <= 200 |
a > b |
greater(a, b) |
Maior que | price > 500 |
a >= b |
greaterOrEquals(a, b) |
Maior que ou igual a | price >= 500 |
a LIKE s |
like(a, b) |
Correspondência de padrões (diferencia maiúsculas de minúsculas) | name LIKE '%top%' |
a NOT LIKE s |
notLike(a, b) |
Não corresponde ao padrão (diferencia maiúsculas de minúsculas) | name NOT LIKE '%top%' |
a ILIKE s |
ilike(a, b) |
Correspondência de padrões (sem diferenciar maiúsculas de minúsculas) | name ILIKE '%LAPTOP%' |
a BETWEEN b AND c |
a >= b AND a <= c |
Verificação de intervalo (inclusive) | price BETWEEN 100 AND 500 |
a NOT BETWEEN b AND c |
a < b OR a > c |
Verificação fora do intervalo | price NOT BETWEEN 100 AND 500 |
Correspondência de padrões e expressões condicionais
Além dos operadores de comparação, você pode usar correspondência de padrões e expressões condicionais na cláusula WHERE.
| Recurso | Sintaxe | Sensível a maiúsculas e minúsculas | Desempenho | Melhor para |
|---|---|---|---|---|
LIKE |
col LIKE '%pattern%' |
Sim | Rápido | Correspondência exata de padrão |
ILIKE |
col ILIKE '%pattern%' |
Não | Mais lento | Busca sem diferenciar maiúsculas de minúsculas |
if() |
if(cond, a, b) |
N/A | Rápido | Condições binárias simples |
multiIf() |
multiIf(c1, r1, c2, r2, def) |
N/A | Rápido | Múltiplas condições |
CASE |
CASE WHEN ... THEN ... END |
N/A | Rápido | Lógica condicional padrão SQL |
Consulte "Correspondência de padrões e expressões condicionais" para ver exemplos de uso.
Expressão com literais, colunas ou subconsultas
A expressão após a cláusula WHERE também pode incluir literais, colunas ou subconsultas, que são instruções SELECT aninhadas que retornam valores usados em condições.
| Tipo | Definição | Avaliação | Desempenho | Exemplo |
|---|---|---|---|---|
| Literal | Valor constante fixo | No momento da escrita da consulta | Mais rápido | WHERE price > 100 |
| Coluna | Referência aos dados da tabela | Por linha | Rápido | WHERE price > cost |
| Subconsulta | SELECT aninhado |
No momento da execução da consulta | Varia | WHERE id IN (SELECT ...) |
Você pode combinar literais, colunas e subconsultas em condições complexas:
-- Literal + Column
WHERE price > 100 AND category = 'Electronics'
-- Column + Subquery
WHERE price > (SELECT AVG(price) FROM products) AND in_stock = true
-- Literal + Column + Subquery
WHERE category = 'Electronics'
AND price < 500
AND id IN (SELECT product_id FROM bestsellers)
-- All three with operador lógico
WHERE (price > 100 OR category IN (SELECT category FROM featured))
AND in_stock = true
AND name LIKE '%Special%'Exemplos
Verificando NULL
Consultas com valores NULL:
CREATE TABLE t_null(x Int8, y Nullable(Int8)) ENGINE=MergeTree() ORDER BY x;
INSERT INTO t_null VALUES (1, NULL), (2, 3);
SELECT * FROM t_null WHERE y IS NULL;
SELECT * FROM t_null WHERE y != 0;┌─x─┬────y─┐
│ 1 │ ᴺᵁᴸᴸ │
└───┴──────┘
┌─x─┬─y─┐
│ 2 │ 3 │
└───┴───┘Filtrando dados com operadores lógicos
Considere a tabela e os dados a seguir:
CREATE TABLE products (
id UInt32,
name String,
price Float32,
category String,
in_stock Bool
) ENGINE = MergeTree()
ORDER BY id;
INSERT INTO products VALUES
(1, 'Laptop', 999.99, 'Electronics', true),
(2, 'Mouse', 25.50, 'Electronics', true),
(3, 'Desk', 299.00, 'Furniture', false),
(4, 'Chair', 150.00, 'Furniture', true),
(5, 'Monitor', 350.00, 'Electronics', true),
(6, 'Lamp', 45.00, 'Furniture', false);1. AND - ambas as condições devem ser atendidas:
SELECT * FROM products
WHERE category = 'Electronics' AND price < 500; ┌─id─┬─name────┬─price─┬─category────┬─in_stock─┐
1. │ 2 │ Mouse │ 25.5 │ Electronics │ true │
2. │ 5 │ Monitor │ 350 │ Electronics │ true │
└────┴─────────┴───────┴─────────────┴──────────┘2. OR - pelo menos uma condição deve ser atendida:
SELECT * FROM products
WHERE category = 'Furniture' OR price > 500; ┌─id─┬─name───┬──price─┬─category────┬─in_stock─┐
1. │ 1 │ Laptop │ 999.99 │ Electronics │ true │
2. │ 3 │ Desk │ 299 │ Furniture │ false │
3. │ 4 │ Chair │ 150 │ Furniture │ true │
4. │ 6 │ Lamp │ 45 │ Furniture │ false │
└────┴────────┴────────┴─────────────┴──────────┘3. NOT - Nega uma condição:
SELECT * FROM products
WHERE NOT in_stock; ┌─id─┬─name─┬─price─┬─category──┬─in_stock─┐
1. │ 3 │ Desk │ 299 │ Furniture │ false │
2. │ 6 │ Lamp │ 45 │ Furniture │ false │
└────┴──────┴───────┴───────────┴──────────┘4. XOR - Exatamente uma condição deve ser verdadeira (mas não ambas):
SELECT *
FROM products
WHERE xor(price > 200, category = 'Electronics') ┌─id─┬─name──┬─price─┬─category────┬─in_stock─┐
1. │ 2 │ Mouse │ 25.5 │ Electronics │ true │
2. │ 3 │ Desk │ 299 │ Furniture │ false │
└────┴───────┴───────┴─────────────┴──────────┘5. Combinando vários operadores:
SELECT * FROM products
WHERE (category = 'Electronics' OR category = 'Furniture')
AND in_stock = true
AND price < 400; ┌─id─┬─name────┬─price─┬─category────┬─in_stock─┐
1. │ 2 │ Mouse │ 25.5 │ Electronics │ true │
2. │ 4 │ Chair │ 150 │ Furniture │ true │
3. │ 5 │ Monitor │ 350 │ Electronics │ true │
└────┴─────────┴───────┴─────────────┴──────────┘6. Usando sintaxe de função:
SELECT * FROM products
WHERE and(or(category = 'Electronics', price > 100), in_stock); ┌─id─┬─name────┬──price─┬─category────┬─in_stock─┐
1. │ 1 │ Laptop │ 999.99 │ Electronics │ true │
2. │ 2 │ Mouse │ 25.5 │ Electronics │ true │
3. │ 4 │ Chair │ 150 │ Furniture │ true │
4. │ 5 │ Monitor │ 350 │ Electronics │ true │
└────┴─────────┴────────┴─────────────┴──────────┘A sintaxe com palavras-chave SQL (AND, OR, NOT, XOR) geralmente é mais legível, mas a sintaxe de função pode ser útil em expressões complexas ou ao criar consultas dinâmicas.
Usando colunas UInt8 como condição
Usando a tabela de um exemplo anterior, você pode usar o nome de uma coluna diretamente como condição:
SELECT * FROM products
WHERE in_stock ┌─id─┬─name────┬──price─┬─category────┬─in_stock─┐
1. │ 1 │ Laptop │ 999.99 │ Electronics │ true │
2. │ 2 │ Mouse │ 25.5 │ Electronics │ true │
3. │ 4 │ Chair │ 150 │ Furniture │ true │
4. │ 5 │ Monitor │ 350 │ Electronics │ true │
└────┴─────────┴────────┴─────────────┴──────────┘Usando operadores de comparação
Os exemplos abaixo usam a tabela e os dados do exemplo acima. Os resultados foram omitidos por brevidade.
1. Igualdade explícita com true (= 1 ou = true):
SELECT * FROM products
WHERE in_stock = true;
-- ou
WHERE in_stock = 1;2. Igualdade explícita com false (= 0 ou = false):
SELECT * FROM products
WHERE in_stock = false;
-- ou
WHERE in_stock = 0;3. Desigualdade (!= 0 ou != false):
SELECT * FROM products
WHERE in_stock != false;
-- ou
WHERE in_stock != 0;4. Maior que:
SELECT * FROM products
WHERE in_stock > 0;5. Menor ou igual a:
SELECT * FROM products
WHERE in_stock <= 0;6. Em combinação com outras condições:
SELECT * FROM products
WHERE in_stock AND price < 400;7. Usando o operador IN:
No exemplo abaixo, (1, true) é uma tupla.
SELECT * FROM products
WHERE in_stock IN (1, true);Você também pode usar um array para isso:
SELECT * FROM products
WHERE in_stock IN [1, true];8. Mistura de estilos de comparação:
SELECT * FROM products
WHERE category = 'Electronics' AND in_stock = true;Correspondência de padrões e expressões condicionais
Os exemplos abaixo usam a tabela e os dados do exemplo acima. Os resultados foram omitidos por brevidade.
Exemplos de LIKE
-- Encontrar produtos com 'o' no nome
SELECT * FROM products WHERE name LIKE '%o%';
-- Resultado: Laptop, Monitor
-- Encontrar produtos que começam com 'L'
SELECT * FROM products WHERE name LIKE 'L%';
-- Resultado: Laptop, Lamp
-- Encontrar produtos com exatamente 4 caracteres
SELECT * FROM products WHERE name LIKE '____';
-- Resultado: Desk, LampExemplos de ILIKE
-- Busca sem distinção entre maiúsculas e minúsculas por 'LAPTOP'
SELECT * FROM products WHERE name ILIKE '%laptop%';
-- Result: Laptop
-- Correspondência de prefixo sem distinção entre maiúsculas e minúsculas
SELECT * FROM products WHERE name ILIKE 'l%';
-- Result: Laptop, LampExemplos de IF
-- Diferentes limites de preço por categoria
SELECT * FROM products
WHERE if(category = 'Electronics', price < 500, price < 200);
-- Resultado: Mouse, Chair, Monitor
-- (Electronics abaixo de $500 OU Furniture abaixo de $200)
-- Filtrar com base no status do estoque
SELECT * FROM products
WHERE if(in_stock, price > 100, true);
-- Resultado: Laptop, Chair, Monitor, Desk, Lamp
-- (Itens em estoque acima de $100 OU todos os itens fora de estoque)Exemplos de multiIf
-- Múltiplas condições baseadas em categoria
SELECT * FROM products
WHERE multiIf(
category = 'Electronics', price < 600,
category = 'Furniture', in_stock = true,
false
);
-- Resultado: Mouse, Monitor, Chair
-- (Electronics < $600 OU Furniture em estoque)
-- Filtragem em camadas
SELECT * FROM products
WHERE multiIf(
price > 500, category = 'Electronics',
price > 100, in_stock = true,
true
);
-- Resultado: Laptop, Chair, Monitor, LampExemplos de CASE
CASE simples:
-- Different rules per category
SELECT * FROM products
WHERE CASE category
WHEN 'Electronics' THEN price < 400
WHEN 'Furniture' THEN in_stock = true
ELSE false
END;
-- Result: Mouse, Monitor, ChairCASE com condição:
-- Price-based tiered logic
SELECT * FROM products
WHERE CASE
WHEN price > 500 THEN in_stock = true
WHEN price > 100 THEN category = 'Electronics'
ELSE true
END;
-- Result: Laptop, Monitor, Mouse, Lamp