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


145

私は2つの文字列列abテーブルを持っていますfoo

select a, b from fooaとを返しますb。ただし、aおよびの連結bません。私は試した :

select a || b from foo

そして

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

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


...または別のtextタイプ?
PM 77-1 2013年

@acfrancis OPが言っているのでconcatenate、彼は数値型を扱っているのではないかと思いますが、PostgreSQLもそれらのいくつかを扱います。こちらをご覧ください:postgresql.org/docs/9.1/static/functions-string.html
PM 77-1

はい、これらの列はcharacter(2)です。「+」は機能しません-「指定された名前と引数の型に一致する演算子はありません。明示的な型キャストを追加する必要がある場合があります。」
Alex

PostgreSQLのバージョンは?以下は9.1のドキュメントです:postgresql.org/docs/9.1/static/functions-string.html。私の例を参照してください:sqlfiddle.com
PM 77-1

おそらく、クエリに連結に関連しない構文エラーがあります。
PM 77-1 2013年

回答:


260

では、文字列型などの列character(2)、ので、(あなたは、後述するように)、表示された連結だけで動作し、マニュアルを引用します:

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

大胆な強調鉱山。2番目の例(select a||', '||b from foo)は、型指定されていない文字列リテラルのデフォルトがtypeであるため、どのデータ型で機能します', 'textなり、式全体がどの場合でも有効になる。

文字列以外のデータ型の場合、次の方法で最初のステートメントを「修正」できます 、少なくとも1つの引数をにキャストすることtext。(すべての型をキャストできますtext):

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

あなた自身の答えから判断し、「動作しない」は「NULLを返す」ことを意味するはずでした。何かの結果NULLに連結された 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)の文字列連結の有効な演算子ではありません。これを自社の製品に追加するのはマイクロソフトの個人的な考えです。

使用する正当な理由はほとんどありませんcharacter(n)(同義語:)char(n)textまたはをvarchar使用します。詳細:


ありがとうございました。最初のバージョンはnullでは機能せず、2番目のバージョンではconcat_wsのエラーが発生しました。指定された名前と引数の型に一致する関数はありません。明示的な型キャストを追加する必要がある場合があります。
Alex

1
見ましたPostgres 9.1 or laterよね?質問は、最初にPostgresのバージョンを提供する必要がありました。他に戻る前に、必要なすべての情報で質問更新してください。
Erwin Brandstetter 2013年

ありがとう、私が見つけたソリューションはどのPostgresバージョンでも機能します
Alex

SELECT concat(a, b) FROM foo;Postgresの9.3ときに私の作品abされているVARCHARの。
2015

あなたの答えをありがとう、それは私の問題を解決しました:)。
アシュワカル

33

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

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

18

連結にはPostgreSQLでCONCAT関数を使用する方が良いです

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

column_a ||を使用している場合 '' || column_aまたはcolumn_bのいずれかの値がnullの場合、2 columnの連結のcolumn_bはnull値を返します。これはすべてのケースで優先されるとは限りません。

||

使用する

CONCAT

それらのいずれかに値がある場合、関連する値を返します


7

CONCAT関数が古いpostgreSQLバージョンで機能しないことがある

CONCATを使用せずに問題を解決するために使用したものを確認する

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

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

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

2番目のケースでは、first_nameとlast_nameに二重引用符を使用しました

これが役に立てば幸い、ありがとう


1
私の名または姓がnullの場合、連結値もnullを示します
Lokesh

2

私もこれで立ち往生していたので、私にとって最も効果的な解決策を共有する必要があると思います。これもずっと簡単だと思います。

大文字のテーブル名を使用する場合。

SELECT CONCAT("firstName", ' ', "lastName") FROM "User"

小文字のテーブル名を使用する場合

SELECT CONCAT(firstName, ' ', lastName) FROM user

それでおしまい!。PGSQLは列宣言の二重引用符と文字列の単一引用符を数えるので、これは魅力のように機能します。


1

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

||を使用する シンボルまたは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);

これは魅力的でした!!!



-1

たとえば、次のような列で構成される従業員テーブルがあるとします。

employee_number,f_name,l_name,email_id,phone_number 

f_name + l_nameとして連結したい場合name

SELECT employee_number,f_name ::TEXT ||','|| l_name::TEXT  AS "NAME",email_id,phone_number,designation FROM EMPLOYEE;

この回答は既存の回答に何を追加しますか?
Erwin Brandstetter 2017
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.