PostgreSQL
 sql >> Teknologi Basis Data >  >> RDS >> PostgreSQL

Membuat urutan karakter pada postgreSQL

Tantangan diterima;)

Saya tidak berpikir ada cara untuk melakukannya hanya dengan mekanisme urutan PostgreSQL ( 1 )Tetapi jika Anda benar-benar membutuhkan sesuatu seperti itu (dan saya cukup tertarik mengapa Anda membutuhkan sesuatu seperti ini), Anda dapat melakukan fungsi yang mengembalikan nilai berikutnya yang Anda inginkan dan memasukkannya ke dalam pemicu.

Misal buat tabel dulu :

create table test (test_id varchar);

Gunakan fungsi seperti di bawah ini

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$;

Lampirkan fungsi ke pemicu sebelum

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

Masukkan nilai yang tidak terlalu penting (tetap akan diubah)

insert into test values ('ttt');

Kemudian Anda dapat mengamati bahwa Anda memiliki karakter yang tepat.

select *
from test;

Saya tahu itu agak berat tetapi saya tidak melihat yang lain. Fungsinya mungkin tidak sempurna tetapi saya tidak punya banyak waktu :)

Semoga bermanfaat;)




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Bagaimana cara mengabaikan kesalahan dengan psql \copy meta-command

  2. Apa sebenarnya yang dilakukan oleh/pernyataan data ini di SAS? Setara dengan PostgreSQL?

  3. PG::InvalidColumnReference:ERROR:untuk SELECT DISTINCT, ekspresi ORDER BY harus muncul di daftar pilih

  4. Output INFO meskipun SET client_min_messages TO PERINGATAN sebelum

  5. Pilih jumlah jawaban MCQ berdasarkan jawaban pertanyaan sebelumnya