使用 oracle SQL 查询生成字母序列

Generate sequence of alphabets in using oracle SQL query

我有一个任务,我必须在每次执行相同的 oracle 查询时生成字母序列。

示例:

所以,它应该生成A,B,C,D......Z。一旦到达 Z,它必须生成 AA、AB、AC.....AZ

如何编写查询?

使用字母顺序表示序列不是一个好主意,您应该使用数值。为此,Oracle 提供了 IDENTITY COLUMN

如果您确实需要一个字母序列,那么您可以创建一个简单的 SEQUENCE 和一个 return 是 字母序列[=30= 的 FUNCTION ] 你的选择。在函数中使用 Tom's 查询:

CREATE SEQUENCE s;

CREATE OR REPLACE FUNCTION get_alpha_seq (seq_val IN NUMBER)
RETURN VARCHAR2 AS
    v_val NUMBER;
    alpha_seq VARCHAR2(4000);
BEGIN
    v_val := seq_val;
    SELECT case when i3 > 0 then chr(i3+ascii('A')-1) end ||
           case when i2 > 0 then chr(i2+ascii('A')-1) end ||
           chr(i1+ascii('A')-1)
    INTO alpha_seq
      FROM (
    SELECT mod((v_val-1),27) i1,
           mod( trunc((v_val-0.1)/27), 27) i2,
               mod( trunc((v_val-0.1)/27/27), 27 ) i3,
              v_val l
     FROM dual
          )
    WHERE i1 <> 0
      AND NOT( l>= 27*27 and i2 = 0)
      AND NOT( l>= 27*27*27 and i3 = 0);

RETURN alpha_seq;
END;
/

现在以序列 NEXTVAL 作为输入调用此函数:

SELECT get_alpha_seq(s.nextval) FROM dual;

演示:

SQL> SELECT get_alpha_seq(s.nextval) FROM dual;

GET_ALPHA_SEQ(S.NEXTVAL)
------------------------------
A

SQL> SELECT get_alpha_seq(s.nextval) FROM dual;

GET_ALPHA_SEQ(S.NEXTVAL)
------------------------------
B

同样,它可以return字母顺序如下:

A
B
C
...
Z
AA
AB
...
AY
AZ
BA
BB
...
ZZ
AAA
AAB
...
ZZZ

为了确保只有这个查询使用我们可以使用下面的序列

  create table alpha_seq( t number);
  insert into alpha_seq values(0);

然后使用下面的函数

    CREATE OR REPLACE FUNCTION get_alpha_sequence 
    RETURN VARCHAR2 AS
    pragma autonomous_transaction;
        v_value NUMBER;
        alpha_seq VARCHAR2(4000);
    begin
    update alpha_seq set t=t+1;
    select t into v_value from alpha_seq;
    commit;
    with
     letters
     as
     (select chr( ascii('A')+level-1 ) letter
        from dual
      connect by level <= 26
     ),
     alpha as (select *
      from letters
      union all
     select l1.letter || l2.letter
      from letters l1, letters l2
     union all
      select l1.letter || l2.letter || l3.letter
      from letters l1, letters l2, letters l3)
      select letter into alpha_seq from (select a.*,rownum rw1 from alpha a
      where rownum <=v_value) where rw1=v_value;
      return alpha_seq;
      END;

输出:-

 select get_alpha_sequence from dual;

 A


 select get_alpha_sequence from dual;

 B