Los operadores de comparación habituales están disponibles, como se muestra en la Tabla 9.1.

Cuadro 9.1. Operadores de comparación

Operador Descripción
datatype<datatypeboolean Menos que
datatype>datatypeboolean Mas grande que
datatype<=datatypeboolean Menos que o igual a
datatype>=datatypeboolean Mayor qué o igual a
datatype=datatypeboolean Igual
datatype<>datatypeboolean No es igual
datatype!=datatypeboolean No es igual

Nota

<> es la notación SQL estándar para "no es igual". != es un alias, que se convierte en <> en una etapa muy temprana de análisis. Por tanto, no es posible implementar != y <> operadores que hacen cosas diferentes.

Estos operadores de comparación están disponibles para todos los tipos de datos integrados que tienen un orden natural, incluidos los numéricos, stringy tipos de fecha / hora. Además, las matrices, los tipos compuestos y los rangos se pueden comparar si los tipos de datos de sus componentes son comparables.

Por lo general, también es posible comparar valores de tipos de datos relacionados; por ejemplo integer>bigint trabajará. Algunos casos de este tipo son implementados directamente por "tipo cruzado" operadores de comparación, pero si no hay ningún operador disponible, el analizador coaccionará el tipo menos general al tipo más general y aplicará el operador de comparación de este último.

Como se muestra arriba, todos los operadores de comparación son operadores binarios que devuelven valores de tipo boolean. Por tanto, expresiones como 1 < 2 < 3 no son válidos (porque no hay < operador para comparar un valor booleano con 3). Utilizar el BETWEEN predicados que se muestran a continuación para realizar pruebas de rango.

También hay algunos predicados de comparación, como se muestra en la tabla 9.2. Estos se comportan de forma muy parecida a los operadores, pero tienen una sintaxis especial exigida por el estándar SQL.

Cuadro 9.2. Predicados de comparación

Predicado

Descripción

Ejemplo (s)

datatypeBETWEENdatatypeANDdatatypeboolean

Entre (incluidos los puntos finales del rango).

2 BETWEEN 1 AND 3t

2 BETWEEN 3 AND 1f

datatypeNOT BETWEENdatatypeANDdatatypeboolean

No entre (la negación de BETWEEN).

2 NOT BETWEEN 1 AND 3f

datatypeBETWEEN SYMMETRICdatatypeANDdatatypeboolean

Entre, después de ordenar los dos valores de punto final.

2 BETWEEN SYMMETRIC 3 AND 1t

datatypeNOT BETWEEN SYMMETRICdatatypeANDdatatypeboolean

No entre, después de ordenar los dos valores de punto final.

2 NOT BETWEEN SYMMETRIC 3 AND 1f

datatypeIS DISTINCT FROMdatatypeboolean

No es igual, tratando null como un valor comparable.

1 IS DISTINCT FROM NULLt (en vez de NULL)

NULL IS DISTINCT FROM NULLf (en vez de NULL)

datatypeIS NOT DISTINCT FROMdatatypeboolean

Igual, tratando null como un valor comparable.

1 IS NOT DISTINCT FROM NULLf (en vez de NULL)

NULL IS NOT DISTINCT FROM NULLt (en vez de NULL)

datatypeIS NULLboolean

Prueba si el valor es null.

1.5 IS NULLf

datatypeIS NOT NULLboolean

Prueba si el valor no es null.

'null' IS NOT NULLt

datatypeISNULLboolean

Prueba si el valor es null (sintaxis no estándar).

datatypeNOTNULLboolean

Prueba si el valor no es null (sintaxis no estándar).

booleanIS TRUEboolean

Prueba si la expresión booleana rinde true.

true IS TRUEt

NULL::boolean IS TRUEf (en vez de NULL)

booleanIS NOT TRUEboolean

Prueba si la expresión booleana rinde false o desconocido.

true IS NOT TRUEf

NULL::boolean IS NOT TRUEt (en vez de NULL)

booleanIS FALSEboolean

Prueba si la expresión booleana rinde false.

true IS FALSEf

NULL::boolean IS FALSEf (en vez de NULL)

booleanIS NOT FALSEboolean

Prueba si la expresión booleana rinde true o desconocido.

true IS NOT FALSEt

NULL::boolean IS NOT FALSEt (en vez de NULL)

booleanIS UNKNOWNboolean

Pruebe si la expresión booleana da como resultado desconocido.

true IS UNKNOWNf

NULL::boolean IS UNKNOWNt (en vez de NULL)

booleanIS NOT UNKNOWNboolean

Prueba si la expresión booleana rinde true o false.

true IS NOT UNKNOWNt

NULL::boolean IS NOT UNKNOWNf (en vez de NULL)

los BETWEEN predicado simplifica las pruebas de rango:

a BETWEEN x AND y

es equivalente a

a >= x AND a <= y

Darse cuenta de BETWEEN trata los valores de los puntos finales como incluidos en el rango. BETWEEN SYMMETRIC es como BETWEEN excepto que no hay ningún requisito de que el argumento a la izquierda de AND ser menor o igual que el argumento de la derecha. Si no es así, esos dos argumentos se intercambian automáticamente, por lo que siempre se implica un rango no vacío.

Las diversas variantes de BETWEEN se implementan en términos de los operadores de comparación ordinarios y, por lo tanto, funcionarán para cualquier tipo de datos que se puedan comparar.

Nota

El uso de AND en el BETWEEN la sintaxis crea una ambigüedad con el uso de AND como operador lógico. Para resolver esto, solo se permite un conjunto limitado de tipos de expresión como segundo argumento de un BETWEEN cláusula. Si necesita escribir una subexpresión más compleja en BETWEEN, escriba paréntesis alrededor de la subexpresión.

Rendimiento de los operadores de comparación ordinarios null (que significa "desconocido"), no true o false, cuando cualquiera de las entradas es null. Por ejemplo, 7 = NULL rendimientos null, al igual que 7 <> NULL. Cuando este comportamiento no sea adecuado, utilice el IS [ NOT ] DISTINCT FROM predicados:

a ISDISTINCTFROM b
a ISNOTDISTINCTFROM b

Para nonull entradas, IS DISTINCT FROM es el mismo que el <> operador. Sin embargo, si ambas entradas son null vuelve false, y si solo una entrada es null vuelve true. Similar, IS NOT DISTINCT FROM es idéntico a = para nonull entradas, pero devuelve true cuando ambas entradas son null, y false cuando solo una entrada es null. Por tanto, estos predicados actúan efectivamente como si null eran un valor de datos normal, en lugar de "desconocido".

Para comprobar si un valor es o no null, use los predicados:

expression ISNULL
expression ISNOTNULL

o los predicados equivalentes, pero no estándar:

expression ISNULL
expression NOTNULL

Hacer no escribir expression = NULL porque NULL no es "igual a"NULL. (Los null El valor representa un valor desconocido y no se sabe si dos valores desconocidos son iguales).

Propina

Algunas aplicaciones pueden esperar que expression = NULL devoluciones true si expression evalúa a la null valor. Se recomienda encarecidamente que estas aplicaciones se modifiquen para cumplir con el estándar SQL. Sin embargo, si eso no se puede hacer, la variable de configuración transform_null_equals está disponible. Si está habilitado, PostgreSQL convertirá x = NULL cláusulas para x IS NULL.

Si el expression tiene un valor de fila, entonces IS NULL es true cuando la expresión de la fila en sí es null o cuando todos los campos de la fila son null, tiempo IS NOT NULL es true cuando la expresión de fila en sí no esnull y todos los campos de la fila no sonnull. Debido a este comportamiento, IS NULL y IS NOT NULL no siempre devuelve resultados inversos para expresiones con valores de fila; en particular, una expresión con valores de fila que contiene tanto null y nonull los campos volverán false para ambas pruebas. En algunos casos, puede ser preferible escribir rowIS DISTINCT FROM NULL o rowIS NOT DISTINCT FROM NULL, que simplemente comprobará si el valor total de la fila es null sin pruebas adicionales en los campos de la fila.

Los valores booleanos también se pueden probar usando los predicados

boolean_expression ISTRUE
boolean_expression ISNOTTRUE
boolean_expression ISFALSE
boolean_expression ISNOTFALSE
boolean_expression IS UNKNOWN
boolean_expression ISNOT UNKNOWN

Estos siempre volverán true o false, nunca un null valor, incluso cuando el operando es null. A null la entrada se trata como el valor lógico "desconocido". Darse cuenta de IS UNKNOWN y IS NOT UNKNOWN son efectivamente los mismos que IS NULL y IS NOT NULL, respectivamente, excepto que la expresión de entrada debe ser de tipo booleano.

También están disponibles algunas funciones relacionadas con la comparación, como se muestra en la Tabla 9.3.

Cuadro 9.3. Funciones de comparación

Función

Descripción

Ejemplo (s)

num_nonnulls ( VARIADIC"any" ) → integer

Devuelve el número de nonull argumentos.

num_nonnulls(1, NULL, 2)2

num_nulls ( VARIADIC"any" ) → integer

Devuelve el número de null argumentos.

num_nulls(1, NULL, 2)1

Anterior Hasta próximo
9.1. Operadores logicos Hogar 9.3. Funciones y operadores matemáticos