テーブルに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)
。
ベストアンサー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)
text
varchar