* replace exit with assert in test_single_page * improve save_raw_single_page docs option * More grammar fixes * "Built from" link in new tab * fix mistype * Example of include in docs * add anchor to meeting form * Draft of translation helper * WIP on translation helper * Replace some fa docs content with machine translation * add normalize-en-markdown.sh * normalize some en markdown * normalize some en markdown * admonition support * normalize * normalize * normalize * support wide tables * normalize * normalize * normalize * normalize * normalize * normalize * normalize * normalize * normalize * normalize * normalize * normalize * normalize * lightly edited machine translation of introdpection.md * lightly edited machhine translation of lazy.md * WIP on translation utils * Normalize ru docs * Normalize other languages * some fixes * WIP on normalize/translate tools * add requirements.txt * [experimental] add es docs language as machine translated draft * remove duplicate script * Back to wider tab-stop (narrow renders not so well)
6.1 KiB
Funciones condicionales
si
Controla la bifurcación condicional. A diferencia de la mayoría de los sistemas, ClickHouse siempre evalúa ambas expresiones then
y else
.
Sintaxis
SELECT if(cond, then, else)
Si la condición cond
evalúa a un valor distinto de cero, devuelve el resultado de la expresión then
y el resultado de la expresión else
si está presente, se omite. Si el cond
es cero o NULL
el resultado de la then
expresión se omite y el resultado de la else
expresión, si está presente, se devuelve.
Parámetros
cond
– La condición para la evaluación que puede ser cero o no. El tipo es UInt8, Nullable(UInt8) o NULL.then
- La expresión que se va a devolver si se cumple la condición.else
- La expresión a devolver si no se cumple la condición.-
Valores devueltos
La función se ejecuta then
y else
expresiones y devuelve su resultado, dependiendo de si la condición cond
terminó siendo cero o no.
Ejemplo
Consulta:
SELECT if(1, plus(2, 2), plus(2, 6))
Resultado:
┌─plus(2, 2)─┐
│ 4 │
└────────────┘
Consulta:
SELECT if(0, plus(2, 2), plus(2, 6))
Resultado:
┌─plus(2, 6)─┐
│ 8 │
└────────────┘
then
yelse
debe tener el tipo común más bajo.
Ejemplo:
Toma esto LEFT_RIGHT
tabla:
SELECT *
FROM LEFT_RIGHT
┌─left─┬─right─┐
│ ᴺᵁᴸᴸ │ 4 │
│ 1 │ 3 │
│ 2 │ 2 │
│ 3 │ 1 │
│ 4 │ ᴺᵁᴸᴸ │
└──────┴───────┘
La siguiente consulta compara left
y right
valor:
SELECT
left,
right,
if(left < right, 'left is smaller than right', 'right is greater or equal than left') AS is_smaller
FROM LEFT_RIGHT
WHERE isNotNull(left) AND isNotNull(right)
┌─left─┬─right─┬─is_smaller──────────────────────────┐
│ 1 │ 3 │ left is smaller than right │
│ 2 │ 2 │ right is greater or equal than left │
│ 3 │ 1 │ right is greater or equal than left │
└──────┴───────┴─────────────────────────────────────┘
Nota: NULL
los valores no se utilizan en este ejemplo, compruebe Valores NULL en condicionales apartado.
Operador ternario
Funciona igual que if
función.
Sintaxis: cond ? then : else
Devoluciones then
si el cond
evalúa que es verdadero (mayor que cero), de lo contrario devuelve else
.
-
cond
debe ser de tipo deUInt8
, ythen
yelse
debe tener el tipo común más bajo. -
then
yelse
puede serNULL
Ver también
MultiIf
Le permite escribir el CASO operador más compacto en la consulta.
Sintaxis: multiIf(cond_1, then_1, cond_2, then_2, ..., else)
Parámetros:
cond_N
— La condición para que la función regresethen_N
.then_N
— El resultado de la función cuando se ejecuta.else
— El resultado de la función si no se cumple ninguna de las condiciones.
La función acepta 2N+1
parámetros.
Valores devueltos
La función devuelve uno de los valores then_N
o else
dependiendo de las condiciones cond_N
.
Ejemplo
De nuevo usando LEFT_RIGHT
tabla.
SELECT
left,
right,
multiIf(left < right, 'left is smaller', left > right, 'left is greater', left = right, 'Both equal', 'Null value') AS result
FROM LEFT_RIGHT
┌─left─┬─right─┬─result──────────┐
│ ᴺᵁᴸᴸ │ 4 │ Null value │
│ 1 │ 3 │ left is smaller │
│ 2 │ 2 │ Both equal │
│ 3 │ 1 │ left is greater │
│ 4 │ ᴺᵁᴸᴸ │ Null value │
└──────┴───────┴─────────────────┘
Usar resultados condicionales directamente
Los condicionales siempre dan como resultado 0
, 1
o NULL
. Entonces puedes usar resultados condicionales directamente como este:
SELECT left < right AS is_small
FROM LEFT_RIGHT
┌─is_small─┐
│ ᴺᵁᴸᴸ │
│ 1 │
│ 0 │
│ 0 │
│ ᴺᵁᴸᴸ │
└──────────┘
Valores NULL en condicionales
Cuando NULL
están involucrados en condicionales, el resultado también será NULL
.
SELECT
NULL < 1,
2 < NULL,
NULL < NULL,
NULL = NULL
┌─less(NULL, 1)─┬─less(2, NULL)─┬─less(NULL, NULL)─┬─equals(NULL, NULL)─┐
│ ᴺᵁᴸᴸ │ ᴺᵁᴸᴸ │ ᴺᵁᴸᴸ │ ᴺᵁᴸᴸ │
└───────────────┴───────────────┴──────────────────┴────────────────────┘
Por lo tanto, debe construir sus consultas cuidadosamente si los tipos son Nullable
.
El siguiente ejemplo demuestra esto al no agregar la condición equals a multiIf
.
SELECT
left,
right,
multiIf(left < right, 'left is smaller', left > right, 'right is smaller', 'Both equal') AS faulty_result
FROM LEFT_RIGHT
┌─left─┬─right─┬─faulty_result────┐
│ ᴺᵁᴸᴸ │ 4 │ Both equal │
│ 1 │ 3 │ left is smaller │
│ 2 │ 2 │ Both equal │
│ 3 │ 1 │ right is smaller │
│ 4 │ ᴺᵁᴸᴸ │ Both equal │
└──────┴───────┴──────────────────┘