一般的に、私は@kgrittnのアドバイスに同意します。頑張ってください。
ただし、 concat()
に関する基本的な質問に対処するため :新しい関数concat()
null値を処理する必要がある場合に便利です -そして、あなたの質問でもあなたが参照している質問でもnullは除外されていません。
もし null値、古き良き(SQL標準)連結演算子||
を除外できます。 それでも最良の選択であり、@ luisの答えは問題ありません:
SELECT col_a || col_b;
もし どちらの列もnullになる可能性があり、その場合、結果はnullになります。 COALESCE
で防御できます :
SELECT COALESCE(col_a, '') || COALESCE(col_b, '');
しかし、それはより多くの議論ですぐに退屈になります。ここでconcat()
入ってくる、決して all であっても、nullを返します 引数はnullです。ドキュメントごと:
NULL引数は無視されます。
SELECT concat(col_a, col_b);
残りのコーナーケース どちらの選択肢でも、すべて 入力列がnullです その場合でも、空の文字列''
を取得します 、しかし、代わりにnullが必要な場合があります(少なくとも私はそうします)。考えられる1つの方法:
SELECT CASE
WHEN col_a IS NULL THEN col_b
WHEN col_b IS NULL THEN col_a
ELSE col_a || col_b
END;
これは、列が増えるとすぐに複雑になります。ここでも、concat()
を使用します ただし、特別な条件のチェックを追加します:
SELECT CASE WHEN (col_a, col_b) IS NULL THEN NULL
ELSE concat(col_a, col_b) END;
これはどのように機能しますか?
(col_a, col_b)
行型式の省略表記ROW (col_a, col_b)
。また、行タイプは、すべての場合にのみnullになります。 列がnullです。詳細な説明:
- 一連の列に対するNOTNULL制約
また、 concat_ws()
を使用します 要素間に区切り文字を追加するには(ws
「セパレータ付き」の場合)。
ケビンの答えのような表現:
SELECT $1.zipcode || ' - ' || $1.city || ', ' || $1.state;
PostgreSQL 8.3でnull値を準備するのは面倒です(concat()
なし )。 (多くの)1つの方法:
SELECT COALESCE(
CASE
WHEN $1.zipcode IS NULL THEN $1.city
WHEN $1.city IS NULL THEN $1.zipcode
ELSE $1.zipcode || ' - ' || $1.city
END, '')
|| COALESCE(', ' || $1.state, '');
関数のボラティリティはSTABLE
のみです
concat()
およびconcat_ws()
STABLE
です IMMUTABLE
ではなく関数 データ型出力関数(timestamptz_out
など)を呼び出すことができるためです。 )ロケール設定によって異なります。
TomLaneによる説明。
これにより、インデックス式での直接使用が禁止されます。 知っている 結果が実際には不変である場合は、IMMUTABLE
を使用してこれを回避できます。 関数ラッパー。ここでの例:
- PostgreSQLは「アクセントに依存しない」照合をサポートしていますか?