Я ищу способ генерации алфавитной последовательности:Генерация алфавитной последовательности в оракула
AA, AB, AC, AD, AE, ..., ZZ
.
Может ли кто-нибудь предложить удобный способ сделать это в оракуле.
Я ищу способ генерации алфавитной последовательности:Генерация алфавитной последовательности в оракула
AA, AB, AC, AD, AE, ..., ZZ
.
Может ли кто-нибудь предложить удобный способ сделать это в оракуле.
Это похоже на работу, если вы хотите сделать это в чистом 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 строк (пришлось использовать объединение в качестве первой записи в иерархический запрос начинается с 1, а не 0).
676 - 26 x 26, поэтому он делит число, чтобы получить число для ведущей буквы (преобразуется в букву в главном SELECT
) и использует оставшуюся часть этого деления для задней буквы.
Затем я добавляю 65, чтобы получить номер вверх в область ascii для букв алфавита и там вы идете.
Надеюсь, что это поможет;
Используя условие 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
С этим вы можете генерировать последовательности любой длины:
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>
Здесь: