¿Cuál es la mejor manera de verificar 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 solo una vez bajo control.
Actualmente estoy usando:
coalesce( trim(stringexpression),'')=''
Pero se ve un poco feo.
stringexpression
puede ser una char(n)
columna o expresión que contenga char(n)
columnas con espacios finales.
¿Cuál es la mejor manera?
char
es casi siempre la elección incorrecta debido al relleno (y al desperdicio de espacio resultante). Pero aparte de eso: no creo que haya una mejor solución.Respuestas:
La expresion
stringexpression = ''
produce:TRUE
.. for''
(o para cualquier cadena que consista solo en espacios con el tipo de datoschar(n)
)NULL
.. forNULL
FALSE
... para cualquier otra cosaPara verificar: "
stringexpression
es NULL o está vacío" :O el enfoque inverso (puede ser más fácil de leer):
Funciona para cualquier tipo de personaje incluido
char(n)
. El manual sobre operadores de comparación.O use su expresión original sin
trim()
, que es un ruido costoso parachar(n)
(ver más abajo), o incorrecto para otros tipos de caracteres: las cadenas que consisten en solo espacios pasarían como cadenas vacías.Pero las expresiones en la parte superior son más rápidas.
Afirmar lo contrario es aún más simple: "
stringexpression
no es NULL ni está vacío" :Acerca de
char(n)
Esto es sobre el tipo de datos
char(n)
, la abreviatura de:character(n)
. (char
/character
son la abreviatura dechar(1)
/character(1)
.) Se desaconseja su uso en Postgres :No se debe confundir
char(n)
con otro tipo, útil, caráctervarchar(n)
,varchar
,text
o"char"
(con comillas dobles).En
char(n)
una cadena vacía no es diferente de cualquier otra cadena que consista solo en espacios. Todos estos se pliegan en n espacios enchar(n)
cada definición del tipo. Se deduce lógicamente que las expresiones anteriores también funcionanchar(n)
, tanto como estas (que no funcionarían para otros tipos de caracteres):Manifestación
La cadena vacía equivale a cualquier cadena de espacios cuando se lanza a
char(n)
:Resultado:
Prueba de "cadena nula o vacía" con
char(n)
:Resultado:
Prueba de "cadena nula o vacía" con
text
:Resultado:
db <> violín aquí
Viejo sqlfiddle
Relacionado:
fuente
best way to check if value is null or empty string
. Latrim()
llamada es (comparativamente) costosa, y simplemente no es necesaria. Agregué más sobrechar(n)
y "cadena vacía".''
. ¿Puedo quitar la moldura y usarcoalesce(stringexpression,'')=''
para verificar? Esto me parece más legible en comparación con tu respuesta.select coalesce(' ', '') = ''
devuelve falso Por lo tanto, se requiere TRIM ()coalesce(' '::char(5), '') = ''
no lo hace. En cualquier caso, usaría una de las dos expresiones principales, que funcionan para cualquier tipo de carácter y son más rápidas y limpias.Para verificar nulo y vacío:
Para verificar nulo, vacío y espacios (recortar la cadena)
fuente
Verificar la longitud de la cadena también funciona y es compacto:
fuente
where length(stringexpression) = 0;
. Esto funciona para mi.Si puede haber espacios finales vacíos, probablemente no haya una mejor solución.
COALESCE
es solo para problemas como el tuyo.fuente
Algo que vi a la gente usando es
stringexpression > ''
. Este puede no ser el más rápido, pero resulta ser uno de los más cortos.Lo probé en MS SQL y en PostgreSQL.
fuente
otra forma es
fuente
Mi forma preferida de comparar campos anulables es: NULLIF (nullablefield,: ParameterValue) IS NULL AND NULLIF (: ParameterValue, nullablefield) IS NULL. Esto es engorroso pero es de uso universal, mientras que la fusión es imposible en algunos casos.
El segundo uso inverso de NULLIF se debe a que "NULLIF (nullablefield,: ParameterValue) IS NULL" siempre devolverá "verdadero" si el primer parámetro es nulo.
fuente
Si la base de datos tiene una gran cantidad de registros,
null check
puede tomar más tiempo, puede usar la verificación nula de diferentes maneras, como: 1)where columnname is null
2)where not exists()
3)WHERE (case when columnname is null then true end)
fuente
Muchas de las respuestas son el camino más corto, no necesariamente el mejor si la columna tiene muchos valores nulos. Romper los controles le permite al optimizador evaluar el control más rápido ya que no tiene que trabajar en la otra condición.
La comparación de cadenas no necesita ser evaluada ya que la primera condición es falsa.
fuente