2017-01-16 1 views
0

Я хочу иметь столбец, который содержит уникальный ключ клиента, состоящий из символа числа + в порядке возрастания. Можно ли не каким-то образом проинструктировать Oracle генерировать много записей, от 1а до 1z, а затем 2а 2z и т.д. вплоть до 300000z:Oracle - генерировать записи с буквенно-цифровым номером и символом по возрастанию

CUSTOMER_NUM 
------------ 
10a 

10b 

10c 

. 

. 

10z 

11a 

11b 

. 

Лучшее, что я достиг до сих пор что-то вроде этого:

select ROUND(DBMS_RANDOM.VALUE(9,21)), dbms_random.string('l', 1) from dual; 

Любые идеи кому угодно? Я хотел бы создать тестовую таблицу с по меньшей мере 300 000 записей.

Спасибо!

+0

Зачем вам это нужно? Большой NUMBER не принимает больше байтов, что вы предлагаете - на самом деле он использует * меньше * байтов. –

ответ

0

Ниже запрос должен дать вам желаемый результат.

WITH 
TABLE1 AS (SELECT LEVEL PART_1 FROM DUAL CONNECT BY LEVEL <= 300000), 
TABLE2 AS (SELECT CHR(LEVEL+96) AS PART_2 FROM DUAL CONNECT BY LEVEL <27) 
SELECT PART_1||PART_2 AS KEY_ID FROM TABLE1,TABLE2 
+0

Это кажется очень похожим на ответ Вернфрида Думшайта – Aleksej

+0

Черт, спасибо за быстрый и отличный ответ! Я думаю, мне нужно немного это уточнить, у меня есть столбец, который уже существует, поэтому мне нужно заполнить его всеми перечисленными выше элементами. Как мне пересечь его с помощью команды INSERT? – LordWriter

+0

Если у вас есть 300000 строк уже в базе данных, вам необходимо их обновить, если в таблице нет строк, тогда вы можете использовать 'INSERT INTO YOUR_TABLE SELECT * FROM (выше запрос здесь)' –

0

Вам может понадобиться что-то вроде следующего:

select alpha || num 
from 
(select substr('qwertyuiopasdfghjklzxcvbnm', level, 1) as alpha from dual connect by level <= 26) 
cross join 
(select level as num from dual connect by level <= 2) 
order by num, alpha 

Первый запрос использует строку, содержащую все символы и разделяет его на 26 строк, содержащих один символ.

Второй запрос генерирует заданное количество чисел для соединения с символами.

0

Вы можете попробовать это:

WITH n AS 
    (SELECT LEVEL AS Num FROM dual CONNECT BY LEVEL < 10), 
c AS 
    (SELECT CHR(LEVEL + 96) AS alpha FROM dual CONNECT BY LEVEL <= 26) 
SELECT num||alpha 
FROM n 
    CROSS JOIN c;