> ## Documentation Index
> Fetch the complete documentation index at: https://private-7c7dfe99-mintlify-8a08bda2.mintlify.site/llms.txt
> Use this file to discover all available pages before exploring further.

> Documentación sobre operadores

# Operadores

ClickHouse transforma los operadores en sus funciones correspondientes durante la fase de análisis sintáctico de la consulta, según su prioridad, precedencia y asociatividad.

<div id="access-operators">
  ## Operadores de acceso
</div>

`a[N]` – Acceso a un elemento de un array. La función `arrayElement(a, N)`.

`a.N` – Acceso a un elemento de una tupla. La función `tupleElement(a, N)`.

<div id="numeric-negation-operator">
  ## Operador de negación numérica
</div>

`-a` – la función `negate (a)`.

Para la negación de tupla: [tupleNegate](/es/reference/functions/regular-functions/tuple-functions#tupleNegate).

<div id="multiplication-and-division-operators">
  ## Operadores de multiplicación y división
</div>

`a * b` – La función `multiply (a, b)`.

Para multiplicar una tupla por un número: [tupleMultiplyByNumber](/es/reference/functions/regular-functions/tuple-functions#tupleMultiplyByNumber); para el producto escalar: [dotProduct](/es/reference/functions/regular-functions/array-functions#arrayDotProduct).

`a / b` – La función `divide(a, b)`.

Para dividir una tupla por un número: [tupleDivideByNumber](/es/reference/functions/regular-functions/tuple-functions#tupleDivideByNumber).

`a % b` – La función `modulo(a, b)`.

<div id="addition-and-subtraction-operators">
  ## Operadores de suma y resta
</div>

`a + b` – La función `plus(a, b)`.

Para la suma de tuplas: [tuplePlus](/es/reference/functions/regular-functions/tuple-functions#tuplePlus).

`a - b` – La función `minus(a, b)`.

Para la resta de tuplas: [tupleMinus](/es/reference/functions/regular-functions/tuple-functions#tupleMinus).

<div id="comparison-operators">
  ## Operadores de comparación
</div>

<div id="equals-function">
  ### función equals
</div>

`a = b` – La función `equals(a, b)`.

`a == b` – La función `equals(a, b)`.

<div id="notequals-function">
  ### función notEquals
</div>

`a != b`: la función `notEquals(a, b)`.

`a <> b`: la función `notEquals(a, b)`.

<div id="lessorequals-function">
  ### función lessOrEquals
</div>

`a <= b`: la función `lessOrEquals(a, b)`.

<div id="greaterorequals-function">
  ### función greaterOrEquals
</div>

`a >= b` – La función `greaterOrEquals(a, b)`.

<div id="less-function">
  ### función less
</div>

`a < b` – La función `less(a, b)`.

<div id="greater-function">
  ### función greater
</div>

`a > b` – La función `greater(a, b)`.

<div id="like-function">
  ### función like
</div>

`a LIKE b` – La función `like(a, b)`.

<div id="notlike-function">
  ### función notLike
</div>

`a NOT LIKE b` – La función `notLike(a, b)`.

<div id="ilike-function">
  ### función ilike
</div>

`a ILIKE b` – La función `ilike(a, b)`.

<div id="between-function">
  ### Función BETWEEN
</div>

`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`.

<div id="is-not-distinct-from">
  ### operador `is not distinct from` (`<=>`)
</div>

<Note>
  A partir de la versión 25.10, puedes usar `<=>` igual que cualquier otro operador.
  Antes de la versión 25.10, solo se podía usar en expresiones JOIN, por ejemplo:

  ```sql theme={null}
  CREATE TABLE a (x String) ENGINE = Memory;
  INSERT INTO a VALUES ('ClickHouse');

  SELECT * FROM a AS a1 JOIN a AS a2 ON a1.x <=> a2.x;

  ┌─x──────────┬─a2.x───────┐
  │ ClickHouse │ ClickHouse │
  └────────────┴────────────┘
  ```
</Note>

El operador `<=>` es el operador de igualdad seguro para `NULL`, equivalente a `IS NOT DISTINCT FROM`.
Funciona como el operador de igualdad normal (`=`), pero trata los valores `NULL` como comparables.
Dos valores `NULL` se consideran iguales, y un `NULL` comparado con cualquier valor distinto de `NULL` devuelve 0 (falso) en lugar de `NULL`.

```sql theme={null}
SELECT
  'ClickHouse' <=> NULL,
  NULL <=> NULL
```

```response theme={null}
┌─isNotDistinc⋯use', NULL)─┬─isNotDistinc⋯NULL, NULL)─┐
│                        0 │                        1 │
└──────────────────────────┴──────────────────────────┘
```

<div id="operators-for-working-with-strings">
  ## Operadores para trabajar con cadenas
</div>

<div id="overlay">
  ### OVERLAY
</div>

* `OVERLAY(string PLACING replacement FROM offset)` - La función `overlay(string, replacement, offset)`.
* `OVERLAY(string PLACING replacement FROM offset FOR length)` - La función `overlay(string, replacement, offset, length)`.
* `OVERLAYUTF8(string PLACING replacement FROM offset)` - La función `overlayUTF8(string, replacement, offset)`.
* `OVERLAYUTF8(string PLACING replacement FROM offset FOR length)` - La función `overlayUTF8(string, replacement, offset, length)`.

<div id="operators-for-working-with-data-sets">
  ## Operadores para trabajar con conjuntos de datos
</div>

Consulte los [operadores IN](/es/reference/statements/in) y el operador [EXISTS](/es/reference/operators/exists).

<div id="in-function">
  ### función in
</div>

`a IN ...` – La función `in(a, b)`.

<div id="notin-function">
  ### función notIn
</div>

`a NOT IN ...` – La función `notIn(a, b)`.

<div id="globalin-function">
  ### función globalIn
</div>

`a GLOBAL IN ...` – La función `globalIn(a, b)`.

<div id="globalnotin-function">
  ### función globalNotIn
</div>

`a GLOBAL NOT IN ...` – La función `globalNotIn(a, b)`.

<div id="in-subquery-function">
  ### función in subconsulta
</div>

`a = ANY (subquery)` – La función `in(a, subquery)`.

<div id="notin-subquery-function">
  ### notIn subconsulta function
</div>

`a != ANY (subquery)` – Igual que `a NOT IN (SELECT singleValueOrNull(*) FROM subquery)`.

<div id="in-subquery-function">
  ### función in subconsulta
</div>

`a = ALL (subquery)` – Lo mismo que `a IN (SELECT singleValueOrNull(*) FROM subquery)`.

<div id="notin-subquery-function-1">
  ### función notIn en subconsulta
</div>

`a != ALL (subquery)` – La función `notIn(a, subquery)`.

**Ejemplos**

Consulta con ALL:

```sql title="Query" theme={null}
SELECT number AS a FROM numbers(10) WHERE a > ALL (SELECT number FROM numbers(3, 3));
```

```text title="Response" theme={null}
┌─a─┐
│ 6 │
│ 7 │
│ 8 │
│ 9 │
└───┘
```

Consulta con ANY:

```sql title="Query" theme={null}
SELECT number AS a FROM numbers(10) WHERE a > ANY (SELECT number FROM numbers(3, 3));
```

```text title="Response" theme={null}
┌─a─┐
│ 4 │
│ 5 │
│ 6 │
│ 7 │
│ 8 │
│ 9 │
└───┘
```

<div id="operators-for-working-with-dates-and-times">
  ## Operadores para trabajar con fechas y horas
</div>

<div id="extract">
  ### EXTRACT
</div>

```sql theme={null}
EXTRACT(part FROM date);
```

Extrae componentes de una fecha determinada. Por ejemplo, puedes obtener el mes de una fecha determinada o el segundo de una hora.

El parámetro `part` especifica qué componente de la fecha se debe obtener. Se admiten los siguientes valores:

* `SECOND` — El segundo. Posibles valores: 0–59.
* `MINUTE` — El minuto. Posibles valores: 0–59.
* `HOUR` — La hora. Posibles valores: 0–23.
* `DAY` — El día del mes. Posibles valores: 1–31.
* `WEEK` — El número de semana ISO 8601. Posibles valores: 1–53.
* `MONTH` — El número del mes. Posibles valores: 1–12.
* `QUARTER` — El trimestre. Posibles valores: 1–4.
* `YEAR` — El año.
* `EPOCH` — La marca de tiempo Unix (segundos desde 1970-01-01 00:00:00 UTC). Nota: para `DateTime64`, la parte de subsegundos se trunca.
* `DOW` — El día de la semana (compatible con PostgreSQL). 0 = domingo, 6 = sábado.
* `DOY` — El día del año. Posibles valores: 1–366.
* `ISODOW` — El día de la semana según ISO. 1 = lunes, 7 = domingo.
* `ISOYEAR` — El año de numeración de semanas ISO 8601.
* `CENTURY` — El siglo. Por ejemplo, el año 2024 está en el siglo XXI.
* `DECADE` — La década (año dividido entre 10). Por ejemplo, el año 2024 corresponde a la década 202.
* `MILLENNIUM` — El milenio. Por ejemplo, el año 2024 está en el 3.er milenio.

El parámetro `part` no distingue entre mayúsculas y minúsculas.

El parámetro `date` especifica la fecha o la hora que se debe procesar. Se admiten los tipos [Date](/es/reference/data-types/date), [Date32](/es/reference/data-types/date32), [DateTime](/es/reference/data-types/datetime) y [DateTime64](/es/reference/data-types/datetime64).

Ejemplos:

```sql theme={null}
SELECT EXTRACT(DAY FROM toDate('2017-06-15'));
SELECT EXTRACT(MONTH FROM toDate('2017-06-15'));
SELECT EXTRACT(YEAR FROM toDate('2017-06-15'));
SELECT EXTRACT(EPOCH FROM toDateTime('2024-01-15 12:30:45', 'UTC'));
SELECT EXTRACT(DOW FROM toDate('2024-01-15'));
SELECT EXTRACT(CENTURY FROM toDate('2024-01-01'));
```

En el siguiente ejemplo creamos una tabla e insertamos en ella un valor de tipo `DateTime`.

```sql theme={null}
CREATE TABLE test.Orders
(
    OrderId UInt64,
    OrderName String,
    OrderDate DateTime
) ENGINE = MergeTree
ORDER BY ();
```

```sql theme={null}
INSERT INTO test.Orders VALUES (1, 'Jarlsberg Cheese', toDateTime('2008-10-11 13:23:44'));
```

```sql theme={null}
SELECT
    toYear(OrderDate) AS OrderYear,
    toMonth(OrderDate) AS OrderMonth,
    toDayOfMonth(OrderDate) AS OrderDay,
    toHour(OrderDate) AS OrderHour,
    toMinute(OrderDate) AS OrderMinute,
    toSecond(OrderDate) AS OrderSecond
FROM test.Orders;
```

```text theme={null}
┌─OrderYear─┬─OrderMonth─┬─OrderDay─┬─OrderHour─┬─OrderMinute─┬─OrderSecond─┐
│      2008 │         10 │       11 │        13 │          23 │          44 │
└───────────┴────────────┴──────────┴───────────┴─────────────┴─────────────┘
```

Puedes ver más ejemplos en [tests](https://github.com/ClickHouse/ClickHouse/blob/master/tests/queries/0_stateless/00619_extract.sql).

<div id="interval">
  ### INTERVAL
</div>

Crea un valor de tipo [Interval](/es/reference/data-types/special-data-types/interval) que debe usarse en operaciones aritméticas con valores de tipo [Date](/es/reference/data-types/date) y [DateTime](/es/reference/data-types/datetime).

Tipos de intervalos:

* `SECOND`
* `MINUTE`
* `HOUR`
* `DAY`
* `WEEK`
* `MONTH`
* `QUARTER`
* `YEAR`

También puedes usar una cadena literal al definir el valor de `INTERVAL`. Por ejemplo, `INTERVAL 1 HOUR` es idéntico a `INTERVAL '1 hour'` o `INTERVAL '1' hour`.

<Tip>
  Los intervalos de distintos tipos no pueden combinarse. No puedes usar expresiones como `INTERVAL 4 DAY 1 HOUR`. Especifica los intervalos en unidades menores o iguales que la unidad mínima del intervalo; por ejemplo, `INTERVAL 25 HOUR`. Puedes usar operaciones consecutivas, como en el ejemplo siguiente.
</Tip>

Ejemplos:

```sql theme={null}
SELECT now() AS current_date_time, current_date_time + INTERVAL 4 DAY + INTERVAL 3 HOUR;
```

```text theme={null}
┌───current_date_time─┬─plus(plus(now(), toIntervalDay(4)), toIntervalHour(3))─┐
│ 2020-11-03 22:09:50 │                                    2020-11-08 01:09:50 │
└─────────────────────┴────────────────────────────────────────────────────────┘
```

```sql theme={null}
SELECT now() AS current_date_time, current_date_time + INTERVAL '4 day' + INTERVAL '3 hour';
```

```text theme={null}
┌───current_date_time─┬─plus(plus(now(), toIntervalDay(4)), toIntervalHour(3))─┐
│ 2020-11-03 22:12:10 │                                    2020-11-08 01:12:10 │
└─────────────────────┴────────────────────────────────────────────────────────┘
```

```sql theme={null}
SELECT now() AS current_date_time, current_date_time + INTERVAL '4' day + INTERVAL '3' hour;
```

```text theme={null}
┌───current_date_time─┬─plus(plus(now(), toIntervalDay('4')), toIntervalHour('3'))─┐
│ 2020-11-03 22:33:19 │                                        2020-11-08 01:33:19 │
└─────────────────────┴────────────────────────────────────────────────────────────┘
```

<Note>
  Siempre se prefieren la sintaxis `INTERVAL` o la función `addDays`. La suma o resta simple (con sintaxis como `now() + ...`) no tiene en cuenta la configuración horaria. Por ejemplo, el horario de verano.
</Note>

Ejemplos:

```sql theme={null}
SELECT toDateTime('2014-10-26 00:00:00', 'Asia/Istanbul') AS time, time + 60 * 60 * 24 AS time_plus_24_hours, time + toIntervalDay(1) AS time_plus_1_day;
```

```text theme={null}
┌────────────────time─┬──time_plus_24_hours─┬─────time_plus_1_day─┐
│ 2014-10-26 00:00:00 │ 2014-10-26 23:00:00 │ 2014-10-27 00:00:00 │
└─────────────────────┴─────────────────────┴─────────────────────┘
```

**Véase también**

* tipo de dato [Interval](/es/reference/data-types/special-data-types/interval)
* funciones de conversión de tipos [toInterval](/es/reference/functions/regular-functions/type-conversion-functions#toIntervalYear)

<div id="date-time-addition">
  ### Suma de fecha y hora
</div>

Se puede sumar un valor [Date](/es/reference/data-types/date) o [Date32](/es/reference/data-types/date32) a un valor [Time](/es/reference/data-types/time) o [Time64](/es/reference/data-types/time64) mediante el operador `+`. El resultado es un [DateTime](/es/reference/data-types/datetime) o [DateTime64](/es/reference/data-types/datetime64) que representa la fecha a la hora del día especificada. La operación es conmutativa.

El tipo de resultado depende de los tipos de los operandos:

| Operando izquierdo | Operando derecho | Tipo de resultado |
| ------------------ | ---------------- | ----------------- |
| `Date`             | `Time`           | `DateTime`        |
| `Date`             | `Time64(s)`      | `DateTime64(s)`   |
| `Date32`           | `Time`           | `DateTime64(0)`   |
| `Date32`           | `Time64(s)`      | `DateTime64(s)`   |

<Note>
  El resultado utiliza la [zona horaria de la sesión](/es/reference/settings/session-settings#session_timezone) (o la zona horaria predeterminada del servidor si no se ha configurado ninguna para la sesión). La configuración [`date_time_overflow_behavior`](/es/reference/settings/formats#date_time_overflow_behavior) controla qué sucede cuando el resultado queda fuera del rango representable.
</Note>

Ejemplos:

```sql theme={null}
SET use_legacy_to_time = 0;
SELECT toDate('2024-07-15') + toTime('14:30:25') AS dt, toTypeName(dt);
```

```text theme={null}
┌──────────────────dt─┬─toTypeName(dt)─┐
│ 2024-07-15 14:30:25 │ DateTime       │
└─────────────────────┴────────────────┘
```

```sql theme={null}
SELECT toDate('2024-07-15') + toTime64('14:30:25.123456', 6) AS dt, toTypeName(dt);
```

```text theme={null}
┌─────────────────────────dt─┬─toTypeName(dt)─┐
│ 2024-07-15 14:30:25.123456 │ DateTime64(6)  │
└────────────────────────────┴────────────────┘
```

```sql theme={null}
SELECT toTime64('23:59:59.999', 3) + toDate32('2024-07-15') AS dt, toTypeName(dt);
```

```text theme={null}
┌──────────────────────dt─┬─toTypeName(dt)─┐
│ 2024-07-15 23:59:59.999 │ DateTime64(3)  │
└─────────────────────────┴────────────────┘
```

<div id="logical-and-operator">
  ## Operador lógico AND
</div>

Sintaxis `SELECT a AND b` — calcula la conjunción lógica entre `a` y `b` con la función [and](/es/reference/functions/regular-functions/logical-functions#and).

<div id="logical-or-operator">
  ## Operador lógico OR
</div>

Sintaxis `SELECT a OR b` — calcula la disyunción lógica entre `a` y `b` mediante la función [or](/es/reference/functions/regular-functions/logical-functions#or).

<div id="logical-negation-operator">
  ## Operador de negación lógica
</div>

Sintaxis `SELECT NOT a` — calcula la negación lógica de `a` mediante la función [not](/es/reference/functions/regular-functions/logical-functions#not).

<div id="conditional-operator">
  ## Operador condicional
</div>

`a ? b : c` – La función `if(a, b, c)`.

Nota:

El operador condicional calcula los valores de b y c, luego comprueba si se cumple la condición a y después devuelve el valor correspondiente. Si `b` o `C` es una función [arrayJoin()](/es/reference/functions/regular-functions/array-join), cada fila se replicará independientemente de la condición «a».

<div id="conditional-expression">
  ## Expresión condicional
</div>

```sql theme={null}
CASE [x]
    WHEN a THEN b
    [WHEN ... THEN ...]
    [ELSE c]
END
```

Si se especifica `x`, se usa la función `transform(x, [a, ...], [b, ...], c)`. De lo contrario, se usa `multiIf(a, b, ..., c)`.

Si no hay una cláusula `ELSE c` en la expresión, el valor predeterminado es `NULL`.

La función `transform` no funciona con `NULL`.

<div id="concatenation-operator">
  ## Operador de concatenación
</div>

`s1 || s2` – La función `concat(s1, s2)`.

<div id="lambda-creation-operator">
  ## Operador de creación de lambda
</div>

`x -> expr` – La función `lambda(x, expr)`.

Los siguientes operadores no tienen prioridad, ya que son corchetes:

<div id="array-creation-operator">
  ## Operador de creación de Array
</div>

`[x1, ...]` – La función `array(x1, ...)`.

<div id="tuple-creation-operator">
  ## Operador de creación de tupla
</div>

`(x1, x2, ...)` – La función `tuple(x2, x2, ...)`.

<div id="associativity">
  ## Asociatividad
</div>

Todos los operadores binarios tienen asociatividad por la izquierda. Por ejemplo, `1 + 2 + 3` se transforma en `plus(plus(1, 2), 3)`.
A veces esto no funciona como cabría esperar. Por ejemplo, `SELECT 4 > 2 > 3` dará como resultado 0.

Por motivos de eficiencia, las funciones `and` y `or` aceptan cualquier número de argumentos. Las cadenas correspondientes de operadores `AND` y `OR` se transforman en una única llamada a estas funciones.

<div id="checking-for-null">
  ## Comprobación de `NULL`
</div>

ClickHouse admite los operadores `IS NULL` y `IS NOT NULL`.

<div id="is_null">
  ### IS NULL
</div>

* Para los valores de tipo [Nullable](/es/reference/data-types/nullable), el operador `IS NULL` devuelve:
  * `1` si el valor es `NULL`.
  * `0` en caso contrario.
* Para cualquier otro valor, el operador `IS NULL` siempre devuelve `0`.

Puede optimizarse habilitando la configuración [optimize\_functions\_to\_subcolumns](/es/reference/settings/session-settings#optimize_functions_to_subcolumns). Con `optimize_functions_to_subcolumns = 1`, la función lee solo la [subcolumna](/es/reference/data-types/nullable#finding-null) `null` en lugar de leer y procesar todos los datos de la columna. La consulta `SELECT n IS NULL FROM table` se transforma en `SELECT n.null FROM TABLE`.

```sql theme={null}
SELECT x+100 FROM t_null WHERE y IS NULL
```

```text theme={null}
┌─plus(x, 100)─┐
│          101 │
└──────────────┘
```

<div id="is_not_null">
  ### IS NOT NULL
</div>

* Para los valores de tipo [Nullable](/es/reference/data-types/nullable), el operador `IS NOT NULL` devuelve:
  * `0` si el valor es `NULL`.
  * `1` en caso contrario.
* Para otros valores, el operador `IS NOT NULL` siempre devuelve `1`.

```sql theme={null}
SELECT * FROM t_null WHERE y IS NOT NULL
```

```text theme={null}
┌─x─┬─y─┐
│ 2 │ 3 │
└───┴───┘
```

Se puede optimizar habilitando el ajuste [optimize\_functions\_to\_subcolumns](/es/reference/settings/session-settings#optimize_functions_to_subcolumns). Con `optimize_functions_to_subcolumns = 1`, la función lee solo la subcolumna [null](/es/reference/data-types/nullable#finding-null) en lugar de leer y procesar los datos de toda la columna. La consulta `SELECT n IS NOT NULL FROM table` se convierte en `SELECT NOT n.null FROM TABLE`.
