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

指定された文字列を分割し、caseステートメントを準備します

    クリーンセットアップ:

    CREATE TABLE tbl (
      given_date date
    , set_name varchar
    );
    

    シングルの列名として単一の用語を使用する 値。
    データ型は明らかにdate timestampではありません 。

    テキストパラメータを便利なテーブルに変換するには:

    SELECT unnest(string_to_array('2001-01-01to2001-01-05,2001-01-10to2001-01-15', ',')) AS date_range
         , unnest(string_to_array('s1,s2', ',')) AS set_name;
    

    「Parallelunnest」は便利ですが、注意点があります。 Postgres 9.4 クリーンなソリューション、Postgres 10を追加します 最終的にこれの振る舞いを消毒しました。以下を参照してください。

    動的実行

    プリペアドステートメント

    プリペアドステートメントは、作成中のセッションにのみ表示され、それとともに終了します。ドキュメントごと:

    プリペアドステートメントは、現在のデータベースセッションの間だけ持続します。

    PREPARE セッションごとに1回

    PREPARE upd_tbl AS
    UPDATE tbl t
    SET    set_name = s.set_name
    FROM  (
       SELECT unnest(string_to_array($1, ',')) AS date_range
            , unnest(string_to_array($2, ',')) AS set_name
       ) s
    WHERE t.given_date BETWEEN split_part(date_range, 'to', 1)::date
                           AND split_part(date_range, 'to', 2)::date;
    

    または、クライアントが提供するツールを使用してステートメントを準備します。
    任意のパラメーターを使用してn回実行します:

    EXECUTE upd_tbl('2001-01-01to2001-01-05,2001-01-10to2001-01-15', 's1,s4');
    

    サーバー側機能

    関数は永続化され、すべてに表示されます セッション。

    CREATE FUNCTION 1回

    CREATE OR REPLACE FUNCTION f_upd_tbl(_date_ranges text, _names text)
      RETURNS void AS
    $func$
    UPDATE tbl t
    SET    set_name = s.set_name
    FROM  (
       SELECT unnest(string_to_array($1, ',')) AS date_range
            , unnest(string_to_array($2, ',')) AS set_name
       ) s
    WHERE  t.given_date BETWEEN split_part(date_range, 'to', 1)::date
                            AND split_part(date_range, 'to', 2)::date
    $func$  LANGUAGE sql;
    

    n回呼び出す:

    SELECT f_upd_tbl('2001-01-01to2001-01-05,2001-01-20to2001-01-25', 's2,s5');
    

    SQLフィドル

    優れたデザイン

    配列パラメータ(文字列リテラルとして引き続き提供可能)、daterangeを使用します タイプ(9.3ページの両方)と新しい並列unnest() (pg 9.4

    CREATE OR REPLACE FUNCTION f_upd_tbl(_dr daterange[], _n text[])
      RETURNS void AS
    $func$
    UPDATE tbl t
    SET    set_name = s.set_name
    FROM   unnest($1, $2) s(date_range, set_name)
    WHERE  t.given_date <@ s.date_range
    $func$  LANGUAGE sql;
    

    <@ 「要素は」演算子に含まれています。

    電話:

    SELECT f_upd_tbl('{"[2001-01-01,2001-01-05]"
                      ,"[2001-01-20,2001-01-25]"}', '{s2,s5}');
    

    詳細:

    • 複数のアレイを並列にネスト解除する


    1. postgresqlはギャップのないシーケンスを生成します

    2. SQL演算子

    3. postgres dbファイル-特定のテーブル/インデックスを表すファイルはどれですか?

    4. PythonMySQLDBIN句で使用するためのリストの実装