在oracle中生成字母序列

时间:2015-12-09 11:52:14

标签: sql oracle plsql plsqldeveloper

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

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

任何人都可以在oracle中建议一种方便的方法。

3 个答案:

答案 0 :(得分:3)

如果你想在纯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区域以获得字母,然后就可以了。

希望它有所帮助;

答案 1 :(得分: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

答案 2 :(得分: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 之后)