sheets google concatenar string postgresql concatenation

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.