使用 oracle SQL 查询生成字母序列
Generate sequence of alphabets in using oracle SQL query
我有一个任务,我必须在每次执行相同的 oracle 查询时生成字母序列。
示例:
- 当我第一次执行查询时,它必须生成 A
- 当我第二次执行相同的查询时,它必须生成 B.
所以,它应该生成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
我有一个任务,我必须在每次执行相同的 oracle 查询时生成字母序列。
示例:
- 当我第一次执行查询时,它必须生成 A
- 当我第二次执行相同的查询时,它必须生成 B.
所以,它应该生成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