web-dev-qa-db-ja.com

PostgresのSELECTで列を連結する方法は?

テーブルaに2つの文字列列bfooがあります。

select a, b from fooは、値aおよびbを返します。ただし、abの連結は機能しません。私は試した :

select a || b from foo

そして

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

コメントからの更新:両方の列がcharacter(2)型です。

120
Alex

値にnullがありました。その場合、連結はNULLでは機能しません。解決策は次のとおりです。

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

character(2)のように string type カラムを使うと(後述します)、表示された連結はただうまくいくだけです。 manual:

[...]文字列連結演算子(||)は、少なくとも1つの入力が文字列型である限り、文字列以外の入力を受け入れます。 表9.8 に示す。それ以外の場合は、textに明示的な強制を挿入してください[...]

私の大胆な強調2番目の例(select a||', '||b from foo)は、anyデータ型に対して機能します。これは、型なし文字列リテラル', 'がデフォルトでtype textになり、式全体が有効になるためです。

文字列以外のデータ型の場合、最初のステートメントを casttextへの少なくとも1つの引数で "修正"できます。 (任意の型をtextにキャストできます。)

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

自分の答え から判断すると、 "は機能しません"は "がNULLを返す"という意味になります。 。 NULLに連結されたanythingの結果はNULLです。 NULLの値が含まれ、結果がNULLにならない場合は、 concat_ws() 任意の数の値を連結する(Postgres 9.1以降):

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

区切り文字が必要ない場合は、concat()のように指定します。

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

両方の関数が "any" 入力を受け取り、テキスト表現を扱うので、ここでは型キャストの必要はありません。

この関連回答の詳細(およびなぜCOALESCEが不適切な代替品であるか):

コメント での更新について

+はPostgres(または標準SQL)での文字列連結には無効な演算子です。これを自社製品に追加することは、Microsoftの私的なアイデアです。

使用するもっともな理由はほとんどありません。 character(n) (シノニム: char(n)textまたはvarchar を使用してください。詳細:

214

連結にはPostgreSQLのCONCAT関数を使用することをお勧めします。

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

column_a ||を使用している場合'' || column_aまたはcolumn_bのいずれかの値がNULLの場合、2列の連結の場合はcolumn_bはNULL値を返します。これはすべての場合に好まれるわけではないかもしれません。

||

つかいます

CONCAT

どちらかに価値がある場合は関連する値を返します

16

CONCAT関数は旧バージョンのpostgreSQLでは動作しないことがあります。

cONCATを使用せずに問題を解決するために使用したものを参照してください。

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

またはあなたも使用することができます

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

後者の場合、first_nameとlast_nameに二重引用符を使用しました。

これが役に立つことを願っています、ありがとう

4

PHPのLaravel framework、私はfirst_name、last_nameの検索を使用しています。フィールドはフルネーム検索のように考慮されます

||を使うsymbolまたは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);

これは魅力を働いた!

0
venkatSkpi

これを試して

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