La mejor manera de comprobar si hay "valores vacíos o nulos"

Resuelto Andrus asked hace 10 años • 11 respuestas

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

stringexpressionpuede ser char(n)una columna o una expresión que contenga char(n)columnas con espacios al final.

¿Cuál es la mejor manera?

Andrus avatar May 21 '14 00:05 Andrus
Aceptado

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: " stringexpressiones 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: " stringexpressionno es ni nulo ni vacío" :

stringexpression <> ''

Acerca dechar(n)

Se trata del tipo de datos char(n), abreviatura de: character(n). ( char/ characterson abreviaturas de char(1)/ character(1).) Se desaconseja su uso en Postgres :

En la mayoría de las situaciones text, o character varyingdebería usarse en su lugar.

No lo confunda con otroschar(n) tipos de caracteres útiles varchar(n), ovarchartext"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?
Erwin Brandstetter avatar May 20 '2014 18:05 Erwin Brandstetter

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), '') = ''
 avatar Dec 14 '2016 10:12