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

Прикрепете функцията към тригер преди

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. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Как да превключите булева стойност в postgres в една заявка

  2. Разликата в подреждането на литералите от тип enum между PostgreSQL 9.0 и 9.1

  3. В Postgresql, принудително уникално при комбинация от две колони

  4. Проблем с PostgreSQL с SQL разработчик

  5. Колоната Postgres не съществува