La mejor manera de comprobar si hay "valores vacíos o nulos"
¿Cuál es la mejor manera de comprobar si el valor es una cadena nula o vacía en las declaraciones SQL de Postgres?
El valor puede ser una expresión larga por lo que es preferible que se escriba sólo una vez en el cheque.
Actualmente estoy usando:
coalesce( trim(stringexpression),'')=''
Pero se ve un poco feo.
stringexpression
puede ser char(n)
una columna o una expresión que contenga char(n)
columnas con espacios al final.
¿Cuál es la mejor manera?
La expresión stringexpression = ''
produce:
true
.. para ''
(o para cualquier cadena que consista únicamente en espacios con el tipo de datos char(n)
)
null
.. para null
false
.. para cualquier otra cosa
Entonces, para verificar: " stringexpression
es nulo o está vacío" :
(stringexpression = '') IS NOT FALSE
O el enfoque inverso (puede ser más fácil de leer):
(stringexpression <> '') IS NOT TRUE
Funciona para cualquier tipo de carácter , incluido char(n)
. El manual sobre operadores de comparación.
O use su expresión original sin trim()
, lo cual es costoso char(n)
(ver más abajo) o incorrecto para otros tipos de caracteres: las cadenas que constan solo de espacios pasarían como una cadena vacía.
coalesce(stringexpression, '') = ''
Pero las expresiones en la parte superior son más rápidas.
Afirmar lo contrario es aún más sencillo: " stringexpression
no es ni nulo ni vacío" :
stringexpression <> ''
Acerca dechar(n)
Se trata del tipo de datos char(n)
, abreviatura de: character(n)
. ( char
/ character
son abreviaturas de char(1)
/ character(1)
.) Se desaconseja su uso en Postgres :
En la mayoría de las situaciones
text
, ocharacter varying
debería usarse en su lugar.
No lo confunda con otroschar(n)
tipos de caracteres útiles varchar(n)
, ovarchar
text
"char"
(entre comillas dobles).
Una cadena vacíachar(n)
no se diferencia de cualquier otra cadena que consta únicamente de espacios. Todos estos se pliegan en n espacios según la definición del tipo. Lógicamente se deduce que las expresiones anteriores también funcionan , tanto como estas (que no funcionarían para otros tipos de caracteres):char(n)
char(n)
coalesce(stringexpression, ' ') = ' '
coalesce(stringexpression, '') = ' '
Manifestación
La cadena vacía equivale a cualquier cadena de espacios cuando se convierte en char(n)
:
SELECT ''::char(5) = ''::char(5) AS eq1
, ''::char(5) = ' '::char(5) AS eq2
, ''::char(5) = ' '::char(5) AS eq3;
Resultado:
eq1 | eq2 | eq3
----+-----+----
t | t | t
Pruebe si hay "cadena nula o vacía" con char(n)
:
SELECT stringexpression
, stringexpression = '' AS base_test
, (stringexpression = '') IS NOT FALSE AS test1
, (stringexpression <> '') IS NOT TRUE AS test2
, coalesce(stringexpression, '') = '' AS coalesce1
, coalesce(stringexpression, ' ') = ' ' AS coalesce2
, coalesce(stringexpression, '') = ' ' AS coalesce3
FROM (
VALUES
('foo'::char(5))
, ('')
, (' ') -- not different from '' in char(n)
, (null)
) sub(stringexpression);
Resultado:
expresión de cadena | prueba_base | prueba1 | prueba2 | fusionarse1 | fusionarse2 | fusionarse3 ------------------+-----------+-------+-------+--- --------+-----------+----------- foo | f | f | f | f | f | F | t | t | t | t | t | t | t | t | t | t | t | t nulo | nulo | t | t | t | t | t
Pruebe si hay "cadena nula o vacía" con text
:
SELECT stringexpression
, stringexpression = '' AS base_test
, (stringexpression = '') IS NOT FALSE AS test1
, (stringexpression <> '') IS NOT TRUE AS test2
, coalesce(stringexpression, '') = '' AS coalesce1
, coalesce(stringexpression, ' ') = ' ' AS coalesce2
, coalesce(stringexpression, '') = ' ' AS coalesce3
FROM (
VALUES
('foo'::text)
, ('')
, (' ') -- different from '' in sane character types
, (null)
) sub(stringexpression);
Resultado:
expresión de cadena | prueba_base | prueba1 | prueba2 | fusionarse1 | fusionarse2 | fusionarse3 ------------------+-----------+-------+-------+--- --------+-----------+----------- foo | f | f | f | f | f | F | t | t | t | t | f | F | f | f | f | f | f | F nulo | nulo | t | t | t | t | F
db<>violín aquí
Antiguo sqlfiddle
Relacionado:
- ¿Alguna desventaja de utilizar el tipo de datos "texto" para almacenar cadenas?
Para comprobar si hay nulos y vacíos:
coalesce(string, '') = ''
Para comprobar si hay nulos, vacíos y espacios (recorte la cadena)
coalesce(TRIM(string), '') = ''