चुनौती स्वीकार की गई;)
मुझे नहीं लगता कि केवल 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$;
फ़ंक्शन को पहले ट्रिगर से अटैच करें
create trigger tg_test before insert on test for each row execute procedure next_id_test();
ऐसा मान डालें जो वास्तव में कोई मायने नहीं रखता (इसे वैसे भी बदल दिया जाएगा)
insert into test values ('ttt');
तब आप देख सकते हैं कि आपके पास सही चरित्र है।
select *
from test;
मुझे पता है कि यह थोड़ा भारी तरीका है लेकिन मुझे कोई दूसरा नहीं दिख रहा है। समारोह शायद सही नहीं है लेकिन मेरे पास बहुत समय नहीं है :)
आशा है कि यह आपकी मदद करने वाला है;)