在oracle中生成字母序列

问题描述 投票:0回答:3

我正在寻找一种生成字母序列的方法:

AA, AB, AC, AD, AE, ..., ZZ
.

任何人都可以建议在 oracle 中执行此操作的便捷方法吗?

sql oracle plsql plsqldeveloper
3个回答
4
投票

如果你想用纯 SQL 完成它,这似乎可行:

SELECT CHR(divided+65)||CHR(remainder+65)
  FROM (
  SELECT 0 AS initial_val,
         0 AS divided,
         0 AS remainder
    FROM dual
 UNION
 SELECT LEVEL AS initial_val,
        TRUNC(LEVEL/26) AS divided,
        MOD(LEVEL,26) AS remainder
   FROM dual
CONNECT BY LEVEL <= 675)
ORDER BY initial_val

它构建了一个包含 676 行的列表(必须使用 union,因为分层查询中的第一条记录从 1 而不是 0 开始)。

676 是 26 x 26,因此它将数字除以得到前导字母的数字(转换为主

SELECT
中的字母),并使用该除法的余数作为尾随字母。

然后我添加 65 将数字放入字母表字母的 ASCII 区域中,然后就可以了。


2
投票

使用 SQL MODEL 子句生成行列表:

SELECT s
FROM (select chr(level + 65 - 1) pos1 from dual connect by level <= 26)
MODEL 
  DIMENSION BY (pos1 AS x, 'A' as y)
  MEASURES ('--' AS s)
  RULES UPSERT ALL ITERATE (26)
(
 s[any, chr(iteration_number + 65)] = (CV(x) || CV(y))
)
ORDER BY s;

示例运行:

09/12/2015 19:55:26:SQL>     SELECT s
  2      FROM (select chr(level + 65 - 1) pos1 from dual connect by level <= 26)
  3      MODEL
  4        DIMENSION BY (pos1 AS x, 'A' as y)
  5        MEASURES ('--' AS s)
  6        RULES UPSERT ALL ITERATE (26)
  7      (
  8       s[any, chr(iteration_number + 65)] = (CV(x) || CV(y))
  9      )
 10      ORDER BY s;

S
--
AA
AB
AC
AD
AE
etc ...

然后我们可以使用 LISTAGG 运行简单的聚合,如下所示:

WITH t AS (
SELECT s
FROM (select chr(level + 65 - 1) pos1 from dual connect by level <= 26)
MODEL 
  DIMENSION BY (pos1 AS x, 'A' as y)
  MEASURES ('--' AS s)
  RULES UPSERT ALL ITERATE (26)
(
 s[any, chr(iteration_number + 65)] = (CV(x) || CV(y))
)
ORDER BY s)
-- data generated, now aggregate
SELECT listagg(s, ', ') WITHIN GROUP (ORDER BY s) aggreg_list
  FROM t;

结果:

09/12/2015 19:52:59:SQL> WITH t AS (
  2  SELECT s
  3  FROM (select chr(level + 65 - 1) pos1 from dual connect by level <= 26)
  4  MODEL
  5    DIMENSION BY (pos1 AS x, 'A' as y)
  6    MEASURES ('--' AS s)
  7    RULES UPSERT ALL ITERATE (26)
  8  (
  9   s[any, chr(iteration_number + 65)] = (CV(x) || CV(y))
 10  )
 11  ORDER BY s)
 12  -- data generated, now aggregate
 13  SELECT listagg(s, ', ') WITHIN GROUP (ORDER BY s) aggreg_list
 14    FROM t;

AGGREG_LIST
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
AA, AB, AC, AD, AE, AF, AG, AH, AI, AJ, AK, AL, AM, AN, AO, AP, AQ, AR, AS, AT, AU, AV, AW, AX, AY, AZ, BA, BB, BC, BD, BE, BF, BG, BH, BI, BJ, BK, BL, BM, BN, BO, BP, BQ, BR, BS, BT, BU, BV, BW, BX, BY, BZ, CA, CB, CC, CD, CE, CF, CG, CH, CI, CJ, CK, CL, CM, CN, CO, CP, CQ, CR, CS, CT, CU, CV, CW, CX, CY, CZ, DA, DB, DC, DD, DE, DF, DG, DH, DI, DJ, DK, DL, DM, DN, DO, DP, DQ, DR, DS, DT, DU, DV, DW, DX, DY, DZ, EA, EB, EC, ED, EE, EF, EG, EH, EI, EJ, EK, EL, EM, EN, EO, EP, EQ, ER, ES, ET, EU,
EV, EW, EX, EY, EZ, FA, FB, FC, FD, FE, FF, FG, FH, FI, FJ, FK, FL, FM, FN, FO, FP, FQ, FR, FS, FT, FU, FV, FW, FX, FY, FZ, GA, GB, GC, GD, GE, GF, GG, GH, GI, GJ, GK, GL, GM, GN, GO, GP, GQ, GR, GS, GT, GU, GV, GW, GX, GY, GZ, HA, HB, HC, HD, HE, HF, HG, HH, HI, HJ, HK, HL, HM, HN, HO, HP, HQ, HR, HS, HT, HU, HV, HW, HX, HY, HZ, IA, IB, IC, ID, IE, IF, IG, IH, II, IJ, IK, IL, IM, IN, IO, IP, IQ, IR, IS, IT, IU, IV, IW, IX, IY, IZ, JA, JB, JC, JD, JE, JF, JG, JH, JI, JJ, JK, JL, JM, JN, JO, JP,
JQ, JR, JS, JT, JU, JV, JW, JX, JY, JZ, KA, KB, KC, KD, KE, KF, KG, KH, KI, KJ, KK, KL, KM, KN, KO, KP, KQ, KR, KS, KT, KU, KV, KW, KX, KY, KZ, LA, LB, LC, LD, LE, LF, LG, LH, LI, LJ, LK, LL, LM, LN, LO, LP, LQ, LR, LS, LT, LU, LV, LW, LX, LY, LZ, MA, MB, MC, MD, ME, MF, MG, MH, MI, MJ, MK, ML, MM, MN, MO, MP, MQ, MR, MS, MT, MU, MV, MW, MX, MY, MZ, NA, NB, NC, ND, NE, NF, NG, NH, NI, NJ, NK, NL, NM, NN, NO, NP, NQ, NR, NS, NT, NU, NV, NW, NX, NY, NZ, OA, OB, OC, OD, OE, OF, OG, OH, OI, OJ, OK,
OL, OM, ON, OO, OP, OQ, OR, OS, OT, OU, OV, OW, OX, OY, OZ, PA, PB, PC, PD, PE, PF, PG, PH, PI, PJ, PK, PL, PM, PN, PO, PP, PQ, PR, PS, PT, PU, PV, PW, PX, PY, PZ, QA, QB, QC, QD, QE, QF, QG, QH, QI, QJ, QK, QL, QM, QN, QO, QP, QQ, QR, QS, QT, QU, QV, QW, QX, QY, QZ, RA, RB, RC, RD, RE, RF, RG, RH, RI, RJ, RK, RL, RM, RN, RO, RP, RQ, RR, RS, RT, RU, RV, RW, RX, RY, RZ, SA, SB, SC, SD, SE, SF, SG, SH, SI, SJ, SK, SL, SM, SN, SO, SP, SQ, SR, SS, ST, SU, SV, SW, SX, SY, SZ, TA, TB, TC, TD, TE, TF,
TG, TH, TI, TJ, TK, TL, TM, TN, TO, TP, TQ, TR, TS, TT, TU, TV, TW, TX, TY, TZ, UA, UB, UC, UD, UE, UF, UG, UH, UI, UJ, UK, UL, UM, UN, UO, UP, UQ, UR, US, UT, UU, UV, UW, UX, UY, UZ, VA, VB, VC, VD, VE, VF, VG, VH, VI, VJ, VK, VL, VM, VN, VO, VP, VQ, VR, VS, VT, VU, VV, VW, VX, VY, VZ, WA, WB, WC, WD, WE, WF, WG, WH, WI, WJ, WK, WL, WM, WN, WO, WP, WQ, WR, WS, WT, WU, WV, WW, WX, WY, WZ, XA, XB, XC, XD, XE, XF, XG, XH, XI, XJ, XK, XL, XM, XN, XO, XP, XQ, XR, XS, XT, XU, XV, XW, XX, XY, XZ, YA,
YB, YC, YD, YE, YF, YG, YH, YI, YJ, YK, YL, YM, YN, YO, YP, YQ, YR, YS, YT, YU, YV, YW, YX, YY, YZ, ZA, ZB, ZC, ZD, ZE, ZF, ZG, ZH, ZI, ZJ, ZK, ZL, ZM, ZN, ZO, ZP, ZQ, ZR, ZS, ZT, ZU, ZV, ZW, ZX, ZY, ZZ

1
投票

用这个你可以生成任意长度的序列:

SQL> with input as (
  2         select 0 as start_position, 3 as strings_length, 35 as sequence_elements, ascii('Z')-ascii('A')+1 as base, ascii('A') as start_val
  3         from dual
  4     )
  5  select sequence_position, listagg(character,'') within group(order by char_level desc) as sequence_value
  6  from (
  7         select inp_sequence.*, format.*, chr(start_val + mod(trunc(sequence_position / power(base, char_level)),base)) as character
  8         from (
  9                 select i.*, start_position + rownum-1 as sequence_position
 10                 from input i
 11                 connect by rownum <= sequence_elements
 12             ) inp_sequence
 13             cross join (
 14                 select rownum-1 as char_level
 15                 from input
 16                 connect by rownum <= strings_length
 17             ) format
 18     )
 19  group by sequence_position
 20  /

SEQUENCE_POSITION SEQUENCE_VALUE
----------------- --------------------------------------------------------------------------------
                0 AAA
                1 AAB
                2 AAC
                3 AAD
                4 AAE
                5 AAF
                6 AAG
                7 AAH
                8 AAI
                9 AAJ
               10 AAK
               11 AAL
               12 AAM
               13 AAN
               14 AAO
               15 AAP
               16 AAQ
               17 AAR
               18 AAS
               19 AAT
               20 AAU
               21 AAV
               22 AAW
               23 AAX
               24 AAY
               25 AAZ
               26 ABA
               27 ABB
               28 ABC
               29 ABD
               30 ABE
               31 ABF
               32 ABG
               33 ABH
               34 ABI

35 rows selected

SQL> 

这里:

  • start_position表示要开始的元素(0代表AA..A)
  • strings_length表示序列中字符串的长度
  • sequence_elements表示要生成的元素数量(紧随start_position
© www.soinside.com 2019 - 2024. All rights reserved.