Operadores de acesso
a[N] – Acesso a um elemento de um Array. A função arrayElement(a, N).
a.N – Acesso a um elemento de uma tupla. A função tupleElement(a, N).
Operador de negação numérica
-a – A função negate(a).
Para a negação de tuplas: tupleNegate.
Operadores de Multiplicação e Divisão
a * b – A função multiply(a, b).
Para multiplicar tupla por um número: tupleMultiplyByNumber; para produto escalar: dotProduct.
a / b – A função divide(a, b).
Para dividir tupla por um número: tupleDivideByNumber.
a % b – A função modulo(a, b).
Operadores de adição e subtração
a + b – A função plus(a, b).
Para adição de tuplas: tuplePlus.
a - b – A função minus(a, b).
Para subtração de tuplas: tupleMinus.
Operadores de comparação
função equals
a = b – A função equals(a, b).
a == b – A função equals(a, b).
função notEquals
a != b – A função notEquals(a, b).
a <> b – A função notEquals(a, b).
função lessOrEquals
a <= b – a função lessOrEquals(a, b).
função greaterOrEquals
a >= b – A função greaterOrEquals(a, b).
função less
a < b – A função less(a, b).
função greater
a > b – A função greater(a, b).
função like
a LIKE b – a função like(a, b).
Função notLike
a NOT LIKE b – a função notLike(a, b).
função ilike
a ILIKE b – a função ilike(a, b).
Função BETWEEN
a BETWEEN b AND c – Equivale a a >= b AND a <= c.
a NOT BETWEEN b AND c – Equivale a a < b OR a > c.
operador is not distinct from (<=>)
A partir da versão 25.10, você pode usar
<=> da mesma forma que qualquer outro operador.
Antes da versão 25.10, ele só podia ser usado em expressões JOIN, por exemplo:<=> é o operador de igualdade compatível com NULL, equivalente a IS NOT DISTINCT FROM.
Ele funciona como o operador de igualdade comum (=), mas trata valores NULL como comparáveis.
Dois valores NULL são considerados iguais, e um NULL comparado com qualquer valor não NULL retorna 0 (falso), em vez de NULL.
Operadores para trabalhar com strings
OVERLAY
OVERLAY(string PLACING replacement FROM offset)- A funçãooverlay(string, replacement, offset).OVERLAY(string PLACING replacement FROM offset FOR length)- A funçãooverlay(string, replacement, offset, length).OVERLAYUTF8(string PLACING replacement FROM offset)- A funçãooverlayUTF8(string, replacement, offset).OVERLAYUTF8(string PLACING replacement FROM offset FOR length)- A funçãooverlayUTF8(string, replacement, offset, length).
Operadores para trabalhar com conjuntos de dados
função in
a IN ... – a função in(a, b).
função notIn
a NOT IN ... – a função notIn(a, b).
função globalIn
a GLOBAL IN ... – a função globalIn(a, b).
função globalNotIn
a GLOBAL NOT IN ... – A função globalNotIn(a, b).
função in de subconsulta
a = ANY (subquery) – A função in(a, subquery).
notIn subconsulta function
a != ANY (subquery) – O mesmo que a NOT IN (SELECT singleValueOrNull(*) FROM subquery).
função in subconsulta
a = ALL (subquery) – O mesmo que a IN (SELECT singleValueOrNull(*) FROM subquery).
função de subconsulta notIn
a != ALL (subquery) – A função notIn(a, subquery).
Exemplos
Consulta com ALL:
Query
Response
Query
Response
SOME / ALL em arrays
SOME / ALL pode ser uma expressão de array (um literal de array, uma coluna do tipo array ou qualquer expressão que retorne um array). Esta é a sintaxe de quantificador de array no estilo do PostgreSQL. Ela é reconhecida durante o parse e reescrita como funções de array, portanto não é necessária nenhuma reescrita manual:
SOME é o quantificador existencial (o sinônimo em SQL de ANY). = e <> recebem tratamento especial e são reescritos como has / NOT has porque têm uma implementação otimizada; a forma geral recorre às funções de ordem superior arrayExists / arrayAll.
A forma com array é reconhecida para os operadores de comparação =, ==, !=, <>, <=>, <, <=, >, >=, os predicados de comparação com palavras-chave IS DISTINCT FROM e IS NOT DISTINCT FROM, e os predicados de busca em string LIKE, ILIKE, NOT LIKE, NOT ILIKE e REGEXP. Os predicados de comparação com palavras-chave e os predicados de busca em string são reconhecidos apenas para a forma com array, não para a forma com subconsulta (que é reduzida a IN/NOT IN). Operadores que não têm significado de quantificador de array — por exemplo, o próprio IN — não são reescritos e mantêm seu significado normal.
Os predicados de busca em string funcionam porque MatchImpl (a implementação por trás de LIKE / ILIKE / REGEXP) oferece suporte a um haystack constante com uma needle não constante. Por exemplo, 'abc' LIKE SOME(['a%', 'b%']) é reescrito como arrayExists(x -> 'abc' LIKE x, ['a%', 'b%']), e 'abc' NOT LIKE ALL(['x%', 'y%']) como arrayAll(x -> 'abc' NOT LIKE x, ['x%', 'y%']). Isso compara uma string com vários patterns; para fazer a correspondência em uma única passagem combinada, você ainda pode usar uma função de busca multipadrão, como multiMatchAny (expressões regulares) ou multiSearchAny (substrings).
ANY não tem suporte na forma com arraySomente SOME e ALL aceitam um array no lado direito. ANY foi excluído porque any também é uma função de agregação, então uma expressão no formato expr = any(x) mantém o significado de chamada de função. Use SOME para o quantificador de array.Query
Response
O tratamento de
NULL difere da forma com subconsultaComo a forma com array é reescrita no parser (onde configurações de consulta como transform_null_in não estão disponíveis, e uma coluna de array por linha não pode usar o caminho IN null-safe do analyzer), ela usa a semântica de dois valores de has (para = / <>) e arrayExists / arrayAll (que convertem um resultado desconhecido de comparação com NULL em 0). Isso pode diferir da forma com subconsulta, cujo tratamento de NULL é reduzido por meio de IN / NOT IN e depende de transform_null_in:Operadores para trabalhar com datas e horas
EXTRACT
part especifica qual parte da data deve ser recuperada. Os seguintes valores estão disponíveis:
NANOSECOND— O nanossegundo. Valores possíveis: 0–999999999.MICROSECOND— O microssegundo. Valores possíveis: 0–999999.MILLISECOND— O milissegundo. Valores possíveis: 0–999.SECOND— O segundo. Valores possíveis: 0–59.MINUTE— O minuto. Valores possíveis: 0–59.HOUR— A hora. Valores possíveis: 0–23.DAY— O dia do mês. Valores possíveis: 1–31.WEEK— O número da semana ISO 8601. Valores possíveis: 1–53.MONTH— O número do mês. Valores possíveis: 1–12.QUARTER— O trimestre. Valores possíveis: 1–4.YEAR— O ano.EPOCH— O Unix timestamp (segundos desde 1970-01-01 00:00:00 UTC). Observação: paraDateTime64, a parte fracionária dos segundos é truncada.DOW— O dia da semana (compatível com PostgreSQL). 0 = domingo, 6 = sábado.DOY— O dia do ano. Valores possíveis: 1–366.ISODOW— O dia ISO da semana. 1 = segunda-feira, 7 = domingo.ISOYEAR— O ano de numeração de semanas ISO 8601.CENTURY— O século. Por exemplo, o ano de 2024 está no século 21.DECADE— A década (ano dividido por 10). Por exemplo, o ano de 2024 tem década 202.MILLENNIUM— O milênio. Por exemplo, o ano de 2024 está no 3º milênio.TIMEZONE_HOUR— A parte da hora com sinal do deslocamento UTC do fuso horário do operando. Por exemplo,+5:30retorna5,-3:30retorna-3.TIMEZONE_MINUTE— A parte dos minutos com sinal do deslocamento UTC do fuso horário do operando. Por exemplo,+5:30retorna30,-3:30retorna-30.
part não diferencia maiúsculas de minúsculas.
O parâmetro date especifica o valor a ser processado. Os tipos Date, Date32, DateTime, DateTime64 e Interval são suportados. Quando date é um Interval, o part solicitado deve corresponder ao tipo armazenado no intervalo (por exemplo, EXTRACT(DAY FROM INTERVAL 5 DAY) é permitido; EXTRACT(HOUR FROM INTERVAL 5 DAY) é rejeitado, porque os intervalos do ClickHouse são de tipo único). O resultado para um operando Interval é Int64.
Exemplos:
DateTime.
INTERVAL
SECONDMINUTEHOURDAYWEEKMONTHQUARTERYEAR
INTERVAL. Por exemplo, INTERVAL 1 HOUR é idêntico a INTERVAL '1 hour' ou INTERVAL '1' hour.
Exemplos:
A sintaxe
INTERVAL ou a função addDays devem ser sempre preferidas. A simples adição ou subtração (com sintaxe como now() + ...) não leva em conta as configurações de horário. Por exemplo, o horário de verão.- tipo de dado Interval
- toInterval funções de conversão de tipo
Adição de data e hora
+. O resultado é um DateTime ou DateTime64 que representa a data no horário informado. A operação é comutativa.
O tipo do resultado depende dos tipos dos operandos:
O resultado usa o fuso horário da sessão (ou o fuso horário padrão do servidor, se nenhum fuso horário da sessão estiver definido). A configuração
date_time_overflow_behavior controla o que acontece quando o resultado fica fora do intervalo representável.AT TIME ZONE e AT LOCAL
AT TIME ZONE e AT LOCAL convertem um valor DateTime ou DateTime64 para outro fuso horário. Eles são açúcar sintático para a função toTimeZone já existente:
zone pode ser qualquer expressão constante do tipo string que resulte em um nome de fuso horário válido (por exemplo, 'America/Denver', 'UTC' ou concat('America', '/', 'Denver')). Como AT TIME ZONE é convertido em toTimeZone, aplicam-se as mesmas regras para argumentos de fuso horário: expressões não constantes, como uma referência de coluna, exigem allow_nonconst_timezone_arguments = 1.
AT LOCAL usa o fuso horário da sessão atual (ou o padrão do servidor, se nenhum fuso horário da sessão estiver definido). Em tabelas Distributed, session_timezone deve ser definido explicitamente; quando está vazio, timeZone() é local ao shard e não pode ser usado como argumento constante de toTimeZone, causando uma exceção ILLEGAL_COLUMN.
Diferentemente do PostgreSQL, em que
timestamp without time zone AT TIME ZONE zone reinterpreta o horário como pertencente ao fuso fornecido antes da conversão, o ClickHouse sempre mantém o mesmo ponto absoluto no tempo e apenas altera o rótulo de fuso horário usado na exibição. Ambas as formas são equivalentes a toTimeZone e não alteram o timestamp subjacente.AT TIME ZONE tem precedência de operador 13 (acima de *///%, que têm 12, e de +/-, que têm 11), em linha com o PostgreSQL. Isso significa que a * ts AT TIME ZONE 'tz' é interpretado como a * (ts AT TIME ZONE 'tz'), e ts + interval AT TIME ZONE 'tz' é interpretado como ts + (interval AT TIME ZONE 'tz'). Para aplicar a conversão de fuso horário após a aritmética, use parênteses explícitos:
Operador lógico AND
SELECT a AND b — calcula a conjunção lógica entre a e b usando a função and.
Operador lógico OR
SELECT a OR b — calcula a disjunção lógica entre a e b usando a função or.
Operador de negação lógica
SELECT NOT a — calcula a negação lógica de a usando a função not.
Operador condicional
a ? b : c – A função if(a, b, c).
Observação:
O operador condicional calcula os valores de b e c, verifica se a condição a é satisfeita e, em seguida, retorna o valor correspondente. Se b ou C for a função arrayJoin(), cada linha será replicada independentemente da condição “a”.
Expressão condicional
x for especificado, será usada a função transform(x, [a, ...], [b, ...], c). Caso contrário, multiIf(a, b, ..., c).
Se não houver a cláusula ELSE c na expressão, o valor padrão será NULL.
A função transform não funciona com NULL.
Operador de concatenação
s1 || s2 – A função concat(s1, s2) function.
Operador de criação de lambda
x -> expr – a função lambda(x, expr).
Os operadores a seguir não têm prioridade, pois são parênteses:
Operador de criação de Array
[x1, ...] – A função array(x1, ...).
Operador de criação de tupla
(x1, x2, ...) – A função tuple(x2, x2, ...).
Associatividade
1 + 2 + 3 é transformado em plus(plus(1, 2), 3).
Às vezes, isso não funciona como você espera. Por exemplo, SELECT 4 > 2 > 3 resultará em 0.
Para maior eficiência, as funções and e or aceitam qualquer número de argumentos. As cadeias correspondentes de operadores AND e OR são transformadas em uma única chamada dessas funções.
Verificando NULL
IS NULL e IS NOT NULL.
IS NULL
- Para valores do tipo Nullable, o operador
IS NULLretorna:1, se o valor forNULL.0, caso contrário.
- Para outros valores, o operador
IS NULLsempre retorna0.
optimize_functions_to_subcolumns = 1, a função lê apenas a subcoluna null, em vez de ler e processar todos os dados da coluna. A consulta SELECT n IS NULL FROM table é transformada em SELECT n.null FROM TABLE.
IS NOT NULL
- Para valores do tipo Nullable, o operador
IS NOT NULLretorna:0, se o valor forNULL.1, caso contrário.
- Para outros valores, o operador
IS NOT NULLsempre retorna1.
optimize_functions_to_subcolumns = 1, a função lê apenas a subcoluna null, em vez de ler e processar todos os dados da coluna. A consulta SELECT n IS NOT NULL FROM table é transformada em SELECT NOT n.null FROM TABLE.
Verificando valores booleanos
IS TRUE, IS FALSE, IS UNKNOWN, IS NOT TRUE, IS NOT FALSE e IS NOT UNKNOWN.
Eles são usados com expressões Bool e Nullable(Bool).
expr IS TRUEretorna1somente seexprfortrue.expr IS FALSEretorna1somente seexprforfalse.expr IS UNKNOWNretorna1somente seexprforNULL.expr IS NOT TRUEretorna1seexprforfalseouNULL.expr IS NOT FALSEretorna1seexprfortrueouNULL.expr IS NOT UNKNOWNretorna1seexprnão forNULL.
IS UNKNOWN equivale a IS NULL, e IS NOT UNKNOWN equivale a IS NOT NULL.