sql - then - Compruebe si un campo compuesto de Postgres es nulo/vacío
isnull en postgresql (2)
Con los tipos compuestos de postgres , básicamente puede construir un campo con la estructura definida como otra tabla. Tengo el campo compuesto llamado "destinatario" de tipo "persona". Este campo de destinatario a menudo se deja vacío en mi escenario específico. ¿Cuál es la forma correcta de verificar si un campo compuesto está vacío? Lo intenté:
select * from bla where recipient is not null
select * from bla where recipient is null
select * from bla where recipient = null
select * from bla where recipient != null
En todos estos casos, no devuelve nada. Entonces, ¿cómo verifica correctamente si un valor compuesto está vacío o no?
ACTUALIZAR
Después de un poco más de lectura, parece que este es mi problema:
Uno puede pensar que
!(x IS NULL) = x IS NOT NULL
es cierto en todos los casos. Pero hay una excepción: los tipos compuestos. Cuando un campo de un valor compuesto esNULL
y otro campoNOT NULL
esNOT NULL
, el resultado de ambos operadores es falso.IS NULL
es verdadero, solo cuando todos los campos sonNULL
.IS NOT NULL
es verdadero, solo cuando todos los camposNOT NULL
sonNOT NULL
. Para cualquier caso en el medio, entonces ambos operadores devuelven falso.
Tengo algunos campos que son nulos y otros que no lo son. Esperaba que el campo se considerara como NO NULO, si algún elemento del campo compuesto no es nulo ... no cuando TODOS no son nulos. ¿Hay alguna otra forma de evitar esto comprobando cada campo?
Para detectar casos en los que no todos los campos del valor compuesto (fila / registro) son NULL:
SELECT *
FROM bla
WHERE NOT (recipient IS NULL);
<row-type> is NULL
solo devuelve TRUE
si todos los campos son NULL
.
<row-type> is NOT NULL
solo devuelve TRUE
si todos los campos NOT NULL
son NOT NULL
.
Los paréntesis son opcionales. La precedencia del operador funciona a nuestro favor de todos modos.
Prueba fila / registro para NULL
Demostrando las diversas opciones:
CREATE TEMP TABLE recipient (r text, i int); -- to register the row type
SELECT recipient
, recipient IS NULL AS all_null
, recipient IS NOT NULL AS all_notnull
, NOT recipient IS NULL AS some_notnull
, NOT recipient IS NOT NULL AS some_null
FROM (
VALUES
((''foo'', 1 )::recipient)
, ((NULL , 2 )::recipient)
, ((NULL , NULL)::recipient)
) AS tbl(recipient);
Resultado:
recipient | all_null | all_notnull | some_notnull | some_null
-----------+----------+-------------+--------------+-----------
(foo,1) | f | t | t | f
(,2) | f | f | t | t
(,) | t | f | f | t
Relacionado:
IS NULL
y IS NOT NULL
funcionan con tipos complejos, por lo que estos dos deberían ser apropiados:
select * from bla where recipient is not null
select * from bla where recipient is null