Comment concaténer des colonnes dans un Postgres SELECT?

j'ai deux colonnes de la chaîne a et b dans la table foo .

select a, b from foo renvoie les valeurs a et b . Toutefois, la concaténation de a et b ne fonctionne pas. J'ai essayé :

select a || b from foo

et

select  a||', '||b from foo

mise à jour des commentaires: les deux colonnes sont de type character(2) .

102
demandé sur Erwin Brandstetter 2013-11-13 04:24:37

7 réponses

avec type de chaîne de caractères colonnes comme character(2) (comme vous l'avez mentionné plus tard), la concaténation affichée fonctionne juste parce que, citant le manuel:

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

le Gras c'est moi qui souligne. Le deuxième exemple ( select a||', '||b from foo ) fonctionne pour n'importe quel types de données puisque la chaîne non typée littérale ', ' par défaut au type text rendant l'expression entière valide dans tous les cas.

pour les types de données non-string, vous pouvez" corriger "la première déclaration par casting au moins un argument à text . ( Tout type peut être moulé en text ):

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

à en juger par votre propre réponse , " ne fonctionne pas " était supposé signifier " renvoie NULL ". Le résultat de anything concatenated to NULL est NULL. Si NULL valeurs peuvent être impliqués et le résultat ne doit pas être nul, utiliser concat_ws() pour concaténer un nombre quelconque de valeurs (Postgres 9.1 ou postérieurs):

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 moulages de type ici puisque les deux fonctions prennent "any" entrée et travail avec des représentations de texte.

plus de détails (et pourquoi COALESCE est un mauvais substitut) en réponse connexe:

concernant la mise à jour dans le commentaire

+ n'est pas valide d'opérateur de concaténation de chaîne dans Postgres (ou de la norme SQL). C'est une idée privée de Microsoft d'ajouter ceci à leurs produits.

il n'y a guère de bonne raison de utilisation character(n) (synonymie: char(n) ). Utilisez text ou varchar . Details:

187
répondu Erwin Brandstetter 2018-06-28 01:55:49

le problème était dans nulls dans les valeurs; alors la concaténation ne fonctionne pas avec nulls. La solution est la suivante:

SELECT coalesce(a, '') || coalesce(b, '') FROM foo;
19
répondu Alex 2015-07-20 22:44:04

il est préférable d'utiliser la fonction CONCAT dans PostgreSQL pour la concaténation

par exemple : select CONCAT(first_name,last_name) from person where pid = 136

si vous utilisez column_a || '' || column_b pour concatenation pour 2 colonnes , si l'une des valeurs dans column_a ou column_b est nulle, la requête retournera la valeur nulle. qui peut ne pas être privilégiés dans tous les cas.. donc au lieu de ce

/ /

utiliser

CONCAT

il sera de retour de valeur pertinente si l'une d'entre eux ont de la valeur

14
répondu arjun nagathankandy 2014-06-09 09:36:14

CONCAT fonctions parfois ne pas fonctionner avec les anciennes version de postgreSQL

voir ce que j'ai utilisé pour résoudre le problème sans utiliser CONCAT

 u.first_name || ' ' || u.last_name as user,

ou aussi vous pouvez utiliser

 "first_name" || ' ' || "last_name" as user,

dans le deuxième cas, j'ai utilisé des guillemets pour first_name et last_name

j'Espère que ce sera utile, merci

3
répondu Rameshwar Vyevhare 2014-12-09 06:47:40

Essayez cette

select textcat(textcat(FirstName,' '),LastName) AS Name from person;
0
répondu Muhammad Sadiq 2015-11-13 10:14:43

PHP Laravel cadre, j'utilise first_name, last_name Fields consider like Full Name Search

à l'Aide de || symbole Ou concat_ws(), concat() les méthodes

$names = str_replace(" ", "", $searchKey);                               
$customers = Customer::where('organization_id',$this->user->organization_id)
             ->where(function ($q) use ($searchKey, $names) {
                 $q->orWhere('phone_number', 'ilike', "%{$searchKey}%"); 
                 $q->orWhere('email', 'ilike', "%{$searchKey}%");
                 $q->orWhereRaw('(first_name || last_name) LIKE ? ', '%' . $names. '%');
    })->orderBy('created_at','desc')->paginate(20);

cela a fonctionné le charme!!!

0
répondu venkatSkpi 2018-06-25 08:17:47

par exemple s'il existe un tableau des employés qui se compose de colonnes comme:

employee_number,f_name,l_name,email_id,phone_number 

si nous voulons concaténer f_name + l_name comme name .

SELECT employee_number,f_name ::TEXT ||','|| l_name::TEXT  AS "NAME",email_id,phone_number,designation FROM EMPLOYEE;
-3
répondu Abhishek Mitra 2018-03-13 15:30:15