vacio then empty consultas campo sql postgresql null composite

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 es NULL y otro campo NOT NULL es NOT NULL , el resultado de ambos operadores es falso. IS NULL es verdadero, solo cuando todos los campos son NULL . IS NOT NULL es verdadero, solo cuando todos los campos NOT NULL son NOT 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

El violín de SQL.

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