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)
.
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;
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 surtext
[...]
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:
_+
_ 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 (synonyme: character(n)
). Utilisez char(n)
text
OU varchar
. Détails:
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
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
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é !!!
Essaye ça
select textcat(textcat(FirstName,' '),LastName) AS Name from person;