sql >> Base de Datos >  >> RDS >> PostgreSQL

¿Cómo concatenar columnas en un SELECT de Postgres?

Con columnas de tipo cadena como character(2) (como mencionaste más adelante), la concatenación mostrada solo funciona porque, citando el manual:

operador de concatenación de cadenas (|| ) acepta entradas que no sean 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 en text [...]

Énfasis en negrita mío. El segundo ejemplo (select a||', '||b from foo ) funciona para cualquier tipos de datos desde el literal de cadena sin tipo ', ' por defecto escribe text haciendo que toda la expresión sea válida en cualquier caso.

Para los tipos de datos que no son de cadena, puede "arreglar" la primera declaración enviando al menos un argumento a text . (Cualquiera el tipo se puede convertir a text ):

SELECT a::text || b AS ab FROM foo;

A juzgar por su propia respuesta, "no funciona " se suponía que significaba "devuelve NULL ". El resultado de cualquier cosa concatenado a NULL es NULL. Si NULO los valores pueden estar involucrados y el resultado no debe ser NULL, use concat_ws() para concatenar cualquier número de valores (Postgres 9.1 o posterior):

SELECT concat_ws(', ', a, b) AS ab FROM foo;

Los separadores solo se agregan entre valores no nulos, es decir, solo cuando es necesario.

O concat() si no necesita separadores:

SELECT concat(a, b) AS ab FROM foo;

No hay necesidad de conversión de tipos aquí ya que ambas funciones toman "any" ingresar y trabajar con representaciones de texto.

Más detalles (y por qué COALESCE es un mal sustituto) en esta respuesta relacionada:

  • Combina dos columnas y agrega una nueva columna

Con respecto 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.

Apenas hay una buena razón para usar character(n) (sinónimo:char(n) ). Usar text o varchar . Detalles:

  • ¿Alguna desventaja de usar el tipo de datos "texto" para almacenar cadenas?
  • La mejor forma de verificar "valores vacíos o nulos"