#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
;