PostgreSQL
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> PostgreSQL

Tạo chuỗi ký tự trên postgreSQL

Thử thách được chấp nhận;)

Tôi không nghĩ rằng có bất kỳ cách nào để làm điều đó chỉ với cơ chế trình tự PostgreSQL ( 1 ) Nhưng nếu bạn thực sự cần một cái gì đó như vậy (và tôi khá quan tâm đến lý do tại sao bạn cần một cái gì đó như thế này), bạn có thể thực hiện một hàm trả lại cho bạn giá trị tiếp theo mà bạn muốn và đặt nó vào trình kích hoạt.

Ví dụ:trước tiên hãy tạo một bảng:

create table test (test_id varchar);

Sử dụng một chức năng như thế này bên dưới

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

Đính kèm hàm vào trước trình kích hoạt

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

Chèn một giá trị không thực sự quan trọng (nó vẫn sẽ được thay đổi)

insert into test values ('ttt');

Sau đó, bạn có thể quan sát thấy bạn có nhân vật phù hợp.

select *
from test;

Tôi biết đó là một cách hơi nặng nhưng tôi không thấy cách nào khác. Chức năng có lẽ không hoàn hảo nhưng tôi không có nhiều thời gian :)

Hy vọng nó sẽ giúp ích cho bạn;)




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Sao chép một bảng (bao gồm các chỉ mục) trong postgres

  2. Gặp lỗi khi ánh xạ cột PostgreSQL LTREE ở chế độ ngủ đông

  3. PostgreSQL có thể thực hiện kết hợp giữa hai thủ tục được lưu trữ trên SQL Server không?

  4. Kiểm tra toàn bộ bảng để tìm một giá trị duy nhất

  5. xác thực lược đồ trường django postgresql json