Повторите заданное количество строк и посчитайте в oracle

#oracle

#Oracle

Вопрос:

Я пытаюсь внести в свою таблицу некоторый вклад, и я также хочу, чтобы она учитывала каждые четыре строки. Таким образом, W01 должен быть в первых четырех строках, но он также должен считать 1-4, затем перейдите к W02 перед повторением операции.

Пример:

  • ABC-W01_1
  • ABC-W01_2
  • ABC-W01-3
  • ABC-W01-4
  • ABC-W02-1
  • ABC-W02-2
  • ABC-W02-3
  • ABC-W02-4

У кого-нибудь есть умное решение для этого?

(Я думаю, я мог бы просто создать его в Excel и импортировать)

Комментарии:

1. Сколько строк вы хотите сгенерировать всего? Если ABC-W часть должна быть исправлена, вы сможете сгенерировать не более 396 строк (99 x 4), этого достаточно?

Ответ №1:

Если у меня действительно есть то, что вы хотите, то, ограничив ввод 100 строками, вы можете сделать:

   select 'ABC-W' || lpad(ceil(level / 4), 2, '0') || '_' || (1 mod(level-1, 4))
    from dual
 connect by level <= 100
 

Ответ №2:

Вот один глупый способ сделать это. Сгенерируйте числа от 1 до 1000; разделите на десять и представьте число в десятичном формате, но используя тире в качестве «десятичной точки». Чтобы получить нужные значения, ограничьте, какие числа используются (больше 10 и с последней цифрой от 1 до 4).

Генерация чисел выполняется в connect by процессе, числа фильтруются в where предложении, а точное форматирование выполняется в select предложении.

 select  'ABC-W' || 
        to_char(level/10, 'fm00d9', 'nls_numeric_characters=-,') as str
from    dual
where   level > 10 and mod(level, 10) between 1 and 4
  and   rownum <= 120  --  Limit to 120 rows; maximum 396 with this format
connect by level <= 1000
;
 

Или, что еще глупее (используйте ABC-W в качестве символа валюты в числовом формате):

 select  to_char(level/10, 'fmL00d9', 
        'nls_currency=ABC-W nls_numeric_characters=-,') as str
from    dual
where   level > 10 and mod(level, 10) between 1 and 4
  and   rownum <= 120  --  Limit to 120 rows; maximum 396 with this format
connect by level <= 1000
;
 

Обратите внимание, что, хотя это решение действительно глупо, оно на 100% допустимо — нет злоупотребления какой-либо функцией SQL, все они просто используются способами, для которых они не были предназначены.

Ответ №3:

Держу пари, что в вашем сообщении есть опечатка и что вы хотите, чтобы 3-му полю предшествовала тире - вместо подчеркивания _ .

Что вы хотите, так это сгенерировать некоторые данные с использованием dual, а затем сделать так, чтобы 2-е поле было функцией rownum , а 3-е поле было другой функцией rownum .

 select 1   floor((id-1)/4) f2,  1   mod(id-1,4) f3
from ( select rownum id from dual connect by level <= 396 )
 

Похоже, что ширина для 2-го поля предназначена для ограничения количества строк до 396.

Ответ №4:

Вы бы использовали это, вам просто нужно заменить xx на номер цикла, который вы хотите во встроенном представлении t1

 select 'ABC-W'||lpad(t1.lvl_1, 2, '0')||'_'||t2.lvl_2
from (
  select level lvl_1 from dual connect by level <= xx
)t1, 
(
  select level lvl_2 from dual connect by level <= 4
)t2
order by 1
;