Visão geral
Usando resultados condicionais diretamente
Condicionais sempre resultam em0, 1 ou NULL. Portanto, você pode usar esses resultados diretamente assim:
Valores NULL em condicionais
Quando valores NULL estão envolvidos em condicionais, o resultado também será NULL.
Nullable.
O exemplo a seguir demonstra isso ao não adicionar a condição de igualdade a multiIf.
Instrução CASE
A expressão CASE no ClickHouse fornece uma lógica condicional semelhante ao operador CASE do SQL. Ela avalia condições e retorna valores com base na primeira condição que corresponde. O ClickHouse oferece suporte a duas formas de CASE:CASE WHEN ... THEN ... ELSE ... END
Esta forma oferece total flexibilidade e é implementada internamente com a função multiIf. Cada condição é avaliada de forma independente, e as expressões podem incluir valores não constantes.
CASE <expr> WHEN <val1> THEN ... WHEN <val2> THEN ... ELSE ... END
Essa forma mais compacta é otimizada para correspondência com valores constantes e usa internamentecaseWithExpression().
Ressalvas
O ClickHouse determina o tipo de resultado de uma expressão CASE (ou seu equivalente interno, comomultiIf) antes de avaliar quaisquer condições. Isso é importante quando as expressões de retorno diferem em tipo, como no caso de fusos horários ou tipos numéricos diferentes.
- O tipo de resultado é selecionado com base no maior tipo compatível entre todos os ramos.
- Depois que esse tipo é selecionado, todos os outros ramos são convertidos implicitamente para ele, mesmo que sua lógica nunca venha a ser executada em tempo de execução.
- Para tipos como DateTime64, em que o fuso horário faz parte da assinatura do tipo, isso pode levar a um comportamento inesperado: o primeiro fuso horário encontrado pode ser usado para todos os ramos, mesmo quando outros ramos especificam fusos horários diferentes.
Asia/Kolkata
DateTime64(3, <timezone>). Ele infere o tipo comum como DateTime64(3, 'Asia/Kolkata' por ser o primeiro que encontra, convertendo implicitamente os outros ramos para esse tipo.
Isso pode ser resolvido convertendo para string para preservar a formatação de fuso horário desejada:
clamp
Introduzido em: v24.5.0 Restringe um valor para que permaneça dentro dos limites mínimo e máximo especificados. Se o valor for menor que o mínimo, retorna o mínimo. Se o valor for maior que o máximo, retorna o máximo. Caso contrário, retorna o próprio valor. Todos os argumentos devem ser de tipos comparáveis. O tipo do resultado é o maior tipo compatível entre todos os argumentos. Sintaxevalue— O valor a ser restringido. -min— O limite mínimo. -max— O limite máximo.
Query
Response
Query
Response
Query
Response
greatest
Introduzido em: v1.1.0 Retorna o maior valor entre os argumentos. ArgumentosNULL são ignorados.
- Para arrays, retorna o array lexicograficamente maior.
- Para tipos
DateTime, o tipo do resultado é promovido para o maior tipo (por exemplo,DateTime64se combinado comDateTime32).
A versão 24.12 introduziu uma alteração incompatível com versões anteriores, de modo que os valores
NULL são ignorados, enquanto antes a função retornava NULL se um dos argumentos fosse NULL.
Para manter o comportamento anterior, defina a configuração least_greatest_legacy_null_behavior (padrão: false) como true.x1[, x2, ...]— Um ou mais valores para comparar. Todos os argumentos devem ser de tipos comparáveis.Any
Any
Exemplos
Tipos numéricos
Query
Response
Query
Response
Query
Response
if
Introduzido em: v1.1.0 Executa uma ramificação condicional.- Se a condição
condfor avaliada como um valor diferente de zero, a função retorna o resultado da expressãothen. - Se
condfor avaliada como zero ou NULL, o resultado da expressãoelseserá retornado.
short_circuit_function_evaluation controla se a avaliação de curto-circuito é usada.
Se estiver habilitada, a expressão then será avaliada apenas nas linhas em que cond for true, e a expressão else, naquelas em que cond for false.
Por exemplo, com a avaliação de curto-circuito, não é lançada nenhuma exceção de divisão por zero ao executar a seguinte consulta:
then e else devem ser de tipos semelhantes.
Sintaxe
cond— A condição avaliada.UInt8ouNullable(UInt8)ouNULLthen— A expressão retornada secondfor true. -else— A expressão retornada secondfor false ouNULL.
then ou else, dependendo da condição cond.
Exemplos
Exemplo de uso
Query
Response
least
Introduzido em: v1.1.0 Retorna o menor valor entre os argumentos. ArgumentosNULL são ignorados.
- Para arrays, retorna o array lexicograficamente menor.
- Para tipos DateTime, o tipo do resultado é promovido para o maior tipo (por exemplo, DateTime64 se combinado com DateTime32).
A versão 24.12 introduziu uma alteração incompatível com versões anteriores, de modo que os valores
NULL são ignorados, enquanto antes a função retornava NULL se um dos argumentos fosse NULL.
Para manter o comportamento anterior, defina a configuração least_greatest_legacy_null_behavior (padrão: false) como true.x1[, x2, ...]— Um único valor ou vários valores a serem comparados. Todos os argumentos devem ser de tipos comparáveis.Any
Any
Exemplos
Tipos numéricos
Query
Response
Query
Response
Query
Response
multiIf
Introduzido em: v1.1.0 Permite escrever o operadorCASE de forma mais compacta na consulta.
Avalia cada condição em ordem. Para a primeira condição que for true (diferente de zero e não NULL), retorna o valor correspondente.
Se nenhuma das condições for true, retorna o valor de else.
A configuração short_circuit_function_evaluation controla
se a avaliação de curto-circuito é usada. Se estiver ativada, a expressão then_i será avaliada apenas nas linhas em que
((NOT cond_1) AND ... AND (NOT cond_{i-1}) AND cond_i) for true.
Por exemplo, com avaliação de curto-circuito, nenhuma exceção de divisão por zero é lançada ao executar a seguinte consulta:
else devem ter um supertipo comum. As condições NULL são tratadas como falsas.
Sintaxe
caseWithoutExpression, caseWithoutExpr
Argumentos
cond_N— A enésima condição avaliada, que determina sethen_Nserá retornado.UInt8ouNullable(UInt8)ouNULLthen_N— O resultado da função quandocond_Né true. -else— O resultado da função se nenhuma das condições for true.
then_N para o cond_N correspondente; caso contrário, retorna o resultado de else.
Exemplos
Exemplo de uso
Query
Response