string - google - concatenar
La concatenación de cadenas con un nulo parece anular la cadena completa. ¿Es ese el comportamiento deseado en Postgres? (3)
Cita de la documentación
Concatenar todos los argumentos. Los argumentos NULL son ignorados.
Ejemplo
concat(''abcde'', 2, NULL, 22)
Devoluciones
abcde222
Ver más en Documentation
En Postgres:
select ''test'' || null returns null
Esperaba que de lo contrario devolvería ''prueba''.
¿Es este el comportamiento deseado? Parece extraño que la concatenación de cadenas con un valor nulo anularía toda la cadena ...
Refiriéndose a pg docs: http://www.postgresql.org/docs/9.1/static/functions-string.html
"Nota: antes de PostgreSQL 8.3, estas funciones también aceptarían silenciosamente valores de varios tipos de datos no de cadena, debido a la presencia de coerciones implícitas de esos tipos de datos al texto. Estas coerciones se han eliminado porque con frecuencia causaron comportamientos sorprendentes. Sin embargo , el operador de concatenación de cadenas (||) aún acepta la entrada sin cadenas, siempre que al menos una entrada sea de un tipo de cadena, como se muestra en la Tabla 9-6. Para otros casos, inserte una coacción explícita al texto si necesita Para duplicar el comportamiento anterior ".
Dado eso, usando su ejemplo de función de cadena concat:
concat (str "any" [, str "any" [, ...]]) text Concatenar todos los argumentos. Los argumentos NULL son ignorados. concat (''abcde'', 2, NULL, 22) >> abcde222
¿Debería acostumbrarme a este comportamiento con ''||''? ¿Concatenación o es algo que debería ser arreglado?
No es un error y no es "raro".
El estándar de SQL requiere cualquier expresión que implique un null
rendimientos null
. Esto no se limita a la concatenación de cadenas, también se aplica a los cálculos, por ejemplo: 42 * null
devuelve null
.
Esto también se aplica a las comparaciones: 42 > null
produce null
. Así que la comparación no es ni verdadera ni falsa. Aunque en realidad esto tiene el efecto de "falso", pero más porque es "no verdadero", en lugar de falso. Pero negar tal expresión produce null
nuevamente, no "verdadero".
Debido a que null
es tan especial, la única forma de verificar si algo es nulo es usar el operador IS NULL
o IS NOT NULL
. x is null
produce un resultado verdadero o falso, nunca da un null
, por lo que las expresiones que usan el operador is null
o is not null
nunca devuelven el valor nulo, por lo que esta es una excepción a mi declaración anterior (gracias Jonathan por señalarlo).
Otro hecho, tal vez sorprendente, sobre null
valores null
es cómo se manejan mediante funciones agregadas. Mientras que la expresión 4 + 5 + null
produce un valor nulo, la sum()
sobre esos valores (columna) daría 9, porque los agregados ignoran null
valores null
.
Dada la siguiente tabla:
col1
--------
1
2
3
null
sum(col1)
devolverá 6, y avg(col1)
devolverá 2
(sum = 6, número de elementos agregados: 3)
Sí, es el comportamiento deseado.
Aquí hay un ejemplo en el que es muy útil. Digamos que tiene una tabla de personas y en ella los campos title
, primer nombre, nombre de nameaffix
y lastname
. Para construir un nombre completo simplemente puede hacer esto.
COALESCE(title || '' '', '''') || firstname || COALESCE('' '' || nameaffix, '''') || '' '' || lastname
Sin ese comportamiento extraño, sería un buen lugar para colocar los espacios en los lugares correctos dependiendo de si un campo es nulo o no. Asumiendo un nombre y apellido obligatorio, se cubre cualquier combinación de título y nombre del afijo.