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)
.
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 (synonymie: character(n)
). Utilisez char(n)
text
ou varchar
. Details:
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;
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
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
Essayez cette
select textcat(textcat(FirstName,' '),LastName) AS Name from person;
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!!!
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;