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} можно увеличить.

Другие вопросы по тегам