では、文字列型などの列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
使用します。詳細:
text
タイプ?