sql >> データベース >  >> RDS >> PostgreSQL

2つの列を組み合わせて、1つの新しい列に追加します

    一般的に、私は@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は「アクセントに依存しない」照合をサポートしていますか?


    1. クラウドベースのデータベース監視ソリューションの5つのセキュリティ上の利点

    2. 自動インクリメント主キーの並べ替え/リセット

    3. MySQL ABS()関数–数値の絶対値を返します

    4. 単一のSQLステートメントを使用して複数のmax()値を選択する