SQL (Oracle) Выберите без фактической таблицы, содержащей статические данные
Я ищу возможность запуска (Oracle) SQL без запроса реальной таблицы. Здесь я нашел совет с ДВОЙНОЙ таблицей. Это очень хорошо. Но я ищу короткое решение, чтобы выбрать несколько строк из "ниоткуда". Это возможно? Вот самый короткий запрос, который я могу придумать, который делает то, что мне нужно:
Select 1, 'foo' FROM DUAL union
Select 2, 'bar' FROM DUAL union
Select 3, 'more stuff' FROM DUAL
Но если я хочу, чтобы в моем результате было больше строк, это довольно неудобно. Есть ли более короткий путь? Что-то вроде
Select 1, 'foo'; 2, 'bar'; 3, 'more stuff' from dual
or
Select * from (1, 'foo') union (2, 'bar') union (3, 'more stuff')
Я знаю, это не работает, но у вас есть идея? Есть ли простой способ перенести результат запроса? Что-то вроде:
Select transposed (1, 'foo', 2, 'bar', 3, 'more stuff') from dual
Я хочу сохранить количество "накладных расходов" на самом низком уровне.
2 ответа
Ты можешь использовать connect by level
генерировать больше записей - что-то вроде:
select level, decode(level, 1,'foo', 2,'bar', 3,'more stuff')
from dual connect by level <= 3
В случае, если есть несколько столбцов - тогда это работает также -
select
REGEXP_SUBSTR (jango,'^[^#]*') as f1,
REGEXP_SUBSTR(REGEXP_REPLACE(jango,'^([^#]*#){1}', ''),'^[^#]*') as f2,
REGEXP_REPLACE(jango,'^([^#]*#){2}', '') as f3
from
(
Select decode(level,
1, 'foo#koo#joo',
2, 'bar#loo#too' ,
3, 'more stuff#doo#dingo') as jango
from dual connect by level <= 20
)
Вот как это работает - внутренний запрос такой же, как и выше. Я добавил несколько столбцов, используя # - нужно позаботиться о том, чтобы он не входил в семейство regex, иначе нам нужно его избежать.
Select decode(level,
1, 'foo#koo#joo',
2, 'bar#loo#too' ,
3, 'more stuff#doo#dingo') as jango
from dual connect by level <= 20
Дает следующее -
Jango
-------------------
foo#koo#joo
bar#loo#too
more stuff#doo#dingo
Теперь следующий фрагмент выбирает из выходного столбца - 'jango', что-нибудь до #
REGEXP_SUBSTR (jango,'^[^#]*') as f1,
O/p --> foo
для второго столбца мы удаляем содержимое 1-го столбца с последующим #
REGEXP_REPLACE(jango,'^([^#]*#){1}', '')
we get --> koo#joo
Теперь 1-й шаг - получить первое поле.
для большего количества полей {1} можно увеличить.