sql >> Databasteknik >  >> RDS >> PostgreSQL

Skapa en teckensekvens på postgreSQL

Utmaningen accepterad;)

Jag tror inte att det finns något sätt att göra det med enbart PostgreSQL-sekvensmekanism ( 1 )Men om du verkligen behöver något sådant (och jag är ganska intresserad av varför du behöver något sådant här), kan du göra en funktion som returnerar nästa värde du vill ha och sätter det i en trigger.

Skapa till exempel en tabell först :

create table test (test_id varchar);

Använd en funktion som den här nedan

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

Koppla funktionen till en före trigger

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

Infoga ett värde som inte spelar någon roll (det kommer att ändras ändå)

insert into test values ('ttt');

Då kan du se att du har rätt karaktär.

select *
from test;

Jag vet att det är lite tungt men jag ser ingen annan. Funktionen är förmodligen inte perfekt men jag har inte mycket tid :)

Hoppas det kommer att hjälpa dig;)




  1. Lägga till data till en MySQL-databas från ett HTML-formulär

  2. MySQL DATEDIFF() vs TIMESTAMPDIFF():Vad är skillnaden?

  3. Infogar hex-värde i MySQL

  4. SQL CREATE TABLE Syntax – Listad av DBMS