web-dev-qa-db-fra.com

Comment concaténer des colonnes dans un Postgres SELECT?

J'ai deux colonnes de chaîne a et b dans un tableau foo.

select a, b from foo renvoie les valeurs a et b. Cependant, 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 à partir de commentaires: les deux colonnes sont de type character(2).

128
Alex

Le problème était en null dans les valeurs; alors la concaténation ne fonctionne pas avec les valeurs NULL. La solution est la suivante:

SELECT coalesce(a, '') || coalesce(b, '') FROM foo;
29
Alex

Avec type de chaîne des colonnes telles que character(2) (comme vous l’avez mentionné plus tard), la concaténation affichée ne fonctionne que parce que, citant le manuel:

[...] l'opérateur de concaténation de chaînes (_||_) accepte les entrées autres que des chaînes, tant que au moins une entrée est du type chaîne, comme indiqué dans Table 9.8 . Dans les autres cas, insérez une contrainte explicite sur text [...]

Gras accent mien. Le deuxième exemple (_select a||', '||b from foo_) fonctionne pour les types de données any puisque la chaîne littérale non typée _', '_ est définie par défaut sur 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 1ère instruction par transtypage au moins un argument à text. ( Any le type peut être converti en text):

_SELECT a::text || b AS ab FROM foo;
_

A en juger par votre propre réponse , " ne fonctionne pas " était censé signifier " renvoie NULL " . Le résultat de rien concaténé à NULL est NULL. Si les valeurs NULL peuvent être impliquées et que le résultat ne doit pas être NULL, utilisez concat_ws() ) pour concaténer un nombre quelconque 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 transtypages ici puisque les deux fonctions prennent "any" , saisissez et travaillez avec des représentations textuelles.

Plus de détails (et pourquoi COALESCE est un substitut médiocre) dans cette réponse:

En ce qui concerne la mise à jour dans le commentaire

_+_ n'est pas un opérateur valide pour la concaténation de chaînes dans Postgres (ou le standard SQL). C'est une idée privée de Microsoft d'ajouter cela à leurs produits.

Il n’ya pratiquement aucune bonne raison d’utiliser character(n) (synonyme: char(n)). Utilisez text OU varchar . Détails:

224
Erwin Brandstetter

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 la concaténation de 2 colonnes, si l'une des valeurs de column_a ou column_b est null, la requête renverra une valeur null. qui peut ne pas être préféré dans tous les cas .. donc au lieu de cela

||

utilisation

CONCAT

il retournera une valeur pertinente si l'un d'entre eux a une valeur

17

Les fonctions CONCAT ne fonctionnent parfois pas avec les anciennes versions de postgreSQL

vois ce que je faisais 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 second cas, j'ai utilisé des guillemets pour first_name et last_name

J'espère que cela vous sera utile, merci

5
Rameshwar Vyevhare

Le framework Laravel de PHP, J'utilise search first_name, last_name Les champs sont considérés comme des noms complets Rechercher

Utiliser || symbole Ou méthodes concat_ws (), concat ()

$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);

Ce charme travaillé !!!

0
venkatSkpi

Essaye ça

select textcat(textcat(FirstName,' '),LastName) AS Name from person;
0
Muhammad Sadiq