SQL (Oracle) Select без фактической таблицы, содержащей статические данные
Я ищу возможность запустить (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 )Вот как это работает-внутренний запрос такой же, как и выше, я добавил несколько столбцов с помощью # - нужно позаботиться о том, чтобы он не был частью семейства регулярных выражений, иначе нам нужно его избежать.
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-го столбца далее следует #
Теперь 1-й шаг-получить первое поле.REGEXP_REPLACE(jango,'^([^#]*#){1}', '') we get --> koo#jooДля большего количества полей {1} можно увеличить.
Comments