Con columnas de tipo cadena como character(2)
(como mencionó más adelante), la concatenación mostrada simplemente funciona porque, citando el manual:
[...] el operador de concatenación de cadenas ( ||
) acepta entradas sin cadenas, siempre que al menos una entrada sea de tipo cadena , como se muestra en la
Tabla 9.8 . Para otros casos, inserte una coerción explícita para text
[...]
El énfasis en negrita es mío. El segundo ejemplo ( select a||', '||b from foo
) funciona para cualquier tipo de datos, ya que el literal de cadena sin tipo ', '
predeterminado es el tipo que text
hace válida toda la expresión en cualquier caso.
Para los tipos de datos que no son cadenas, puede "arreglar" la primera instrucción enviando al menos un argumento a text
. ( Cualquier tipo puede ser enviado a text
):
SELECT a::text || b AS ab FROM foo;
A juzgar por su propia respuesta , se suponía que " no funciona " significaba " devuelve NULL ". El resultado de cualquier cosa concatenada a NULL es NULL. Si los valores NULL pueden estar involucrados y el resultado no debe ser NULL, úselo concat_ws()
para concatenar cualquier número de valores (Postgres 9.1 o posterior):
SELECT concat_ws(', ', a, b) AS ab FROM foo;
O concat()
si no necesitas separadores:
SELECT concat(a, b) AS ab FROM foo;
No es necesario utilizar tipos de conversión aquí, ya que ambas funciones toman "any"
entrada y trabajan con representaciones de texto.
Más detalles (y por qué COALESCE
es un pobre sustituto) en esta respuesta relacionada:
En cuanto a la actualización en el comentario
+
no es un operador válido para la concatenación de cadenas en Postgres (o SQL estándar). Es una idea privada de Microsoft agregar esto a sus productos.
Casi no hay una buena razón para usar character(n)
(sinónimo:) char(n)
. Use text
ovarchar
. Detalles:
text
tipo?