PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Comment concaténer des colonnes dans un Postgres SELECT ?

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, en citant le manuel :

[...] l'opérateur de concaténation de chaînes (|| ) accepte une entrée non-chaîne, tant qu'au moins une entrée est de type chaîne , comme indiqué dans le tableau 9.8. Pour les autres cas, insérez une coercition explicite dans text [...]

Bold emphase mienne. Le 2ème exemple (select a||', '||b from foo ) fonctionne pour tous types de données depuis le littéral de chaîne non typé ', ' par défaut, tapez text rendant l'expression entière valide dans tous les cas.

Pour les types de données non-chaîne, vous pouvez "corriger" la 1è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 par votre propre réponse, "ne marche pas " était censé signifier "retourne NULL ". Le résultat de n'importe quoi concaténé à NULL est NULL. Si NULL les valeurs peuvent être impliquées et le résultat ne doit pas être NULL, utilisez concat_ws() pour concaténer n'importe quel nombre de valeurs (Postgres 9.1 ou ultérieur) :

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

Les séparateurs ne sont ajoutés qu'entre les valeurs non nulles, c'est-à-dire uniquement si nécessaire.

Ou concat() si vous n'avez pas besoin de séparateurs :

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

Pas besoin de conversions de type ici puisque les deux fonctions prennent "any" saisir et travailler avec des représentations textuelles.

Plus de détails (et pourquoi COALESCE est un piètre substitut) dans cette réponse connexe :

  • Combinez deux colonnes et ajoutez-les dans une nouvelle colonne

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 ceci à leurs produits.

Il n'y a pratiquement aucune bonne raison d'utiliser character(n) (synonyme :char(n) ). Utiliser text ou varchar . Détails :

  • Y a-t-il des inconvénients à utiliser le type de données "texte" pour stocker des chaînes ?
  • Meilleur moyen de vérifier la "valeur vide ou nulle"