Avec des colonnes de type chaîne comme character(2)
(comme vous l'avez mentionné plus tard), la concaténation affichée fonctionne simplement parce que, citant le manuel:
[...] l'opérateur de concaténation de chaîne ( ||
) accepte une entrée non chaîne, à condition qu'au moins une entrée soit de type chaîne , comme indiqué dans le
Tableau 9.8 . Pour les autres cas, insérez une contrainte explicite pour text
[...]
Je souligne le mien. Le deuxième exemple ( select a||', '||b from foo
) fonctionne pour tous les types de données puisque la chaîne littérale non typée ', '
est par défaut de type, text
ce qui rend l'expression entière valide dans tous les cas.
Pour les types de données non-chaîne, vous pouvez "corriger" la première instruction en convertissant au moins un argument en text
. ( Tout type peut être converti en text
):
SELECT a::text || b AS ab FROM foo;
A en juger d'après votre propre réponse , " ne fonctionne pas " était censé signifier " renvoie NULL ". Le résultat de tout ce qui est concaténé à NULL est NULL. Si des valeurs NULL peuvent être impliquées et que le résultat ne doit pas être NULL, utilisez concat_ws()
pour concaténer n'importe quel nombre de valeurs (Postgres 9.1 ou version ultérieure):
SELECT concat_ws(', ', a, b) AS ab FROM foo;
Ou concat()
si vous n'avez pas besoin de séparateurs:
SELECT concat(a, b) AS ab FROM foo;
Pas besoin de casts de type ici puisque les deux fonctions prennent des "any"
entrées et fonctionnent avec des représentations textuelles.
Plus de détails (et pourquoi COALESCE
est un mauvais substitut) dans cette réponse connexe:
Concernant la mise à jour dans le commentaire
+
n'est pas un opérateur valide pour la concaténation de chaînes dans Postgres (ou SQL standard). C'est une idée privée de Microsoft d'ajouter cela à ses produits.
Il n'y a pratiquement aucune bonne raison d'utiliser character(n)
(synonyme:) char(n)
. Utilisez text
ouvarchar
. Détails:
text
type?