sql >> Database >  >> RDS >> PostgreSQL

Hoe kolommen samenvoegen in een Postgres SELECT?

Met kolommen van het tekenreekstype zoals character(2) (zoals je later al zei), de weergegeven aaneenschakeling werkt gewoon omdat, de handleiding citerend:

[...] de tekenreeksaaneenschakelingsoperator (|| ) accepteert niet-tekenreeksinvoer, zolang minstens één invoer van het tekenreekstype is , zoals weergegeven in Tabel 9.8. Voeg voor andere gevallen een expliciete dwang toe aan text [...]

Vetgedrukte nadruk van mij. Het 2e voorbeeld (select a||', '||b from foo ) werkt voor elke gegevenstypen sinds de ongetypte tekenreeks letterlijk ', ' typt standaard text waardoor de hele uitdrukking in elk geval geldig is.

Voor niet-tekenreeksgegevenstypen kunt u de eerste instructie "repareren" door ten minste één argument naar text te casten . (Elke type kan worden gecast naar text ):

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

Afgaande op uw eigen antwoord, "werkt niet " moest betekenen "geeft NULL terug ". Het resultaat van alles aaneengeschakeld naar NULL is NULL. Als NULL waarden kunnen betrokken zijn en het resultaat mag niet NULL zijn, gebruik concat_ws() om een ​​willekeurig aantal waarden samen te voegen (Postgres 9.1 of hoger):

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

Scheidingstekens worden alleen toegevoegd tussen niet-null-waarden, d.w.z. alleen waar nodig.

Of concat() als u geen scheidingstekens nodig heeft:

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

Typecasts zijn hier niet nodig, aangezien beide functies "any" . gebruiken invoer en werk met tekstrepresentaties.

Meer details (en waarom COALESCE is een slechte vervanging) in dit gerelateerde antwoord:

  • Combineer twee kolommen en voeg toe aan één nieuwe kolom

Over update in de opmerking

+ is geen geldige operator voor het samenvoegen van tekenreeksen in Postgres (of standaard SQL). Het is een persoonlijk idee van Microsoft om dit aan hun producten toe te voegen.

Er is nauwelijks een goede reden om character(n) te gebruiken (synoniem:char(n) ). Gebruik text of varchar . Details:

  • Enige nadelen van het gebruik van datatype "text" voor het opslaan van strings?
  • Beste manier om te controleren op "lege of null-waarde"


  1. Hoe u het maximale aantal verbindingen in PostgreSQL kunt verhogen

  2. MySQL:ALTER IGNORE TABLE geeft schending van integriteitsbeperking

  3. ScaleGrid-machtigingen configureren op AWS met behulp van een IAM-beleidssjabloon

  4. Hoe de standaardbeperking van SQL te laten vallen zonder de naam te kennen?