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

postgreSQLでの文字シーケンスの作成

    チャレンジが受け入れられました;)

    PostgreSQLシーケンスメカニズム()だけでそれを行う方法はないと思います。 1 )しかし、本当にそのようなものが必要な場合(そして、なぜこのようなものが必要なのか非常に興味があります)、必要な次の値を返す関数を実行して、それをトリガーに入れることができます。

    たとえば、最初にテーブルを作成します:

    create table test (test_id varchar);
    

    以下のような関数を使用してください

    create or replace function next_id_test()
     returns trigger language plpgsql as $function$
    begin
        with cte_conform_char_list as
        (
            select val, row_number() over (order by val), lead(val) over (order by val)
            from (values ('A'), ('B'), ('C'), ('D'), ('E'), ('F')) as t(val) -- you can continue this list as much as you want it ;)
            order by 1
        )
        , cte_built_char_list as
        (
            select 
                cte.val
                , cte.row_number
                , coalesce(cte.lead, cte_2.val) as next_char
            from cte_conform_char_list cte
                left outer join cte_conform_char_list cte_2
                    on cte_2.row_number = cte.row_number - (select max(row_number) from cte_conform_char_list) +1
        )
        select 
            case 
                when row_number < (select max(row_number) from cte_built_char_list)
                    then repeat(next_char, cast(rank() over (partition by row_number order by test_id) as int)) 
                    else repeat(next_char, cast(rank() over (partition by row_number order by test_id) + 1 as int))
            end as next_test_id into new.test_id
        from test T
            inner join cte_built_char_list cte on substring(T.test_id from 1 for 1) = cte.val
        order by char_length(test_id), test_id;
    
        return new;
    end;
    $function$;
    

    関数をbeforeトリガーにアタッチします

    create trigger tg_test before insert on test for each row execute procedure next_id_test();
    

    あまり重要ではない値を挿入します(とにかく変更されます)

    insert into test values ('ttt');
    

    そうすれば、自分が正しい性格を持っていることがわかります。

    select *
    from test;
    

    少し重い方法だとは思いますが、他には見当たりません。機能は完璧ではないかもしれませんが、時間があまりありません:)

    お役に立てば幸いです;)




    1. MySQLクエリ:エントリが重複している場合は挿入し、そうでない場合は既存の行の値を更新します

    2. Postgres9.1+関数で整数と数値の混合引数を使用する方法

    3. XMLファイルからのMYSQLへの一括挿入

    4. 複数行のエントリを作成すると、次のエラーが発生します:「フィールドリスト」の不明な列「â€〜FName’」に出席できませんでした