テーブルa
に2つの文字列列b
とfoo
があります。
select a, b from foo
は、値a
およびb
を返します。ただし、a
とb
の連結は機能しません。私は試した :
select a || b from foo
そして
select a||', '||b from foo
コメントからの更新:両方の列がcharacter(2)
型です。
値にnullがありました。その場合、連結はNULLでは機能しません。解決策は次のとおりです。
SELECT coalesce(a, '') || coalesce(b, '') FROM foo;
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
を使用してください。詳細:
連結には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
どちらかに価値がある場合は関連する値を返します
CONCAT関数は旧バージョンのpostgreSQLでは動作しないことがあります。
cONCATを使用せずに問題を解決するために使用したものを参照してください。
u.first_name || ' ' || u.last_name as user,
またはあなたも使用することができます
"first_name" || ' ' || "last_name" as user,
後者の場合、first_nameとlast_nameに二重引用符を使用しました。
これが役に立つことを願っています、ありがとう
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);
これは魅力を働いた!
これを試して
select textcat(textcat(FirstName,' '),LastName) AS Name from person;