it-swarm.com.de

Wie verkette ich Spalten in einem Postgres SELECT?

Ich habe zwei Zeichenfolgenspalten a und b in einer Tabelle foo.

select a, b from foo Gibt die Werte a und b zurück. Die Verkettung von a und b funktioniert jedoch nicht. Ich habe es versucht :

select a || b from foo

und

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

Update von Kommentaren: Beide Spalten haben den Typ character(2).

128
Alex

Das Problem war in Nullen in den Werten; dann funktioniert die Verkettung nicht mit Nullen. Die Lösung lautet wie folgt:

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

Mit - Stringtyp Spalten wie character(2) (wie Sie später erwähnten) funktioniert die angezeigte Verkettung nur, weil im Handbuch zitiert:

[...] Der String-Verkettungsoperator (||) akzeptiert Nicht-String-Eingaben, solange mindestens eine Eingabe vom Typ String ist, wie in Tabelle 9.8 . In anderen Fällen fügen Sie einen expliziten Zwang zu text [...] ein.

Meine kühne Betonung. Das zweite Beispiel (select a||', '||b from foo) Funktioniert für any Datentypen, da das untypisierte Zeichenfolgenliteral ', ' Standardmäßig text eingibt, wodurch der gesamte Ausdruck gültig wird auf jeden Fall.

Bei Nicht-String-Datentypen können Sie die erste Anweisung "korrigieren", indem Sie Casting mindestens ein Argument an text übergeben. ( Any Typ kann in text umgewandelt werden):

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

Nach Ihre eigene Antwort zu urteilen, sollte " funktioniert nicht" " liefert NULL" bedeuten. Das Ergebnis von irgendetwas, das mit NULL verknüpft ist, ist NULL. Wenn NULL Werte beteiligt sein können und das Ergebnis nicht NULL sein soll, verwenden Sie concat_ws() um eine beliebige Anzahl von Werten zu verketten (Postgres 9.1 oder höher):

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

Oder concat() wenn Sie keine Trennzeichen benötigen:

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

Hier sind keine Typumwandlungen erforderlich, da beide Funktionen "any" eingeben und mit Textdarstellungen arbeiten.

Weitere Details (und warum COALESCE ein schlechter Ersatz ist) in dieser verwandten Antwort:

Bezüglich Update im Kommentar

+ Ist kein gültiger Operator für die Verkettung von Zeichenfolgen in Postgres (oder dem SQL-Standard). Es ist eine private Idee von Microsoft, dies zu ihren Produkten hinzuzufügen.

Es gibt kaum einen guten Grund dafür character(n) (Synonym: char(n)). Verwenden Sie text oder varchar . Einzelheiten:

224

es ist besser, die CONCAT-Funktion in PostgreSQL für die Verkettung zu verwenden

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

wenn Sie column_a || verwenden '' || column_b für die Verkettung von 2 Spalten. Wenn einer der Werte in column_a oder column_b Null ist, gibt die Abfrage Null zurück. was vielleicht nicht in allen fällen bevorzugt wird .. also stattdessen

||

verwenden

CONCAT

es wird ein relevanter Wert zurückgegeben, wenn einer von beiden Wert hat

17

CONCAT-Funktionen funktionieren manchmal nicht mit älteren PostgreSQL-Versionen

sehen, was ich verwendet habe, um das Problem zu lösen, ohne CONCAT zu verwenden

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

Oder können Sie auch verwenden

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

im zweiten Fall habe ich doppelte Anführungszeichen für Vorname und Nachname verwendet

Hoffe, das wird nützlich sein, danke

5

PHPs Laravel Framework, Ich verwende die Suche Vorname, Nachname Felder gelten als vollständige Namenssuche

Mit || symbol Oder concat_ws (), concat () Methoden

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

Das hat Charme gewirkt !!!

0
venkatSkpi

Versuche dies

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