Postgres SELECTで列を連結するにはどうすればいいですか? 質問する

Postgres SELECTで列を連結するにはどうすればいいですか? 質問する

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

select a, b from fooaとを返しますb。ただし、aとを連結してbも機能しません。試してみました:

select a || b from foo

そして

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

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

ベストアンサー1

文字列型( を含む)の場合character(2)、表示される連結は、マニュアルを引用すると次の理由で機能します。

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

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

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

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

あなたの回答から判断すると、「動作しない」は「null を返す」という意味だったはずです。nullに連結されたものの結果はnull です。null値が関与し、結果が null にならない場合は、concat_ws()任意の数の値を連結するために を使用します。

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

区切り文字は、null 以外の値の間にのみ、つまり必要な場合にのみ追加されます。

または、concat()区切り文字が必要ない場合:

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

"any"どちらの関数も入力を受け取り、テキスト表現を扱うため、型キャストは必要ありません。ただし、これが、と の両方の関数の揮発性がconcat()のみ であり、concat_ws()ではないSTABLE理由でもあります。不変関数IMMUTABLE(インデックス、生成された列、またはパーティション分割など)が必要な場合は、以下を参照してください。

詳細は、COALESCEこの関連回答をご覧ください (なぜ代替品として不十分なのかも)。

余談

+(コメントで言及されているように) は、Postgres (または標準 SQL) の文字列連結の有効な演算子ではありません。これを Microsoft 製品に追加するのは Microsoft の個人的なアイデアです。

(同義語: )を使用する理由はほとんどありません 。または を使用してください。詳細: character(n) char(n) textvarchar

おすすめ記事