Список значений в виде таблицы - PullRequest
2 голосов
/ 25 марта 2020

Я ищу более разумный способ иметь список значений в виде таблицы в Oracle.

В настоящее время я занимаюсь

select 'value1' as val from dual
 union
select 'value2' from dual

На что я надеюсь for - это некоторая функция / way / magi c, которую я сделаю, например,

select 'value1', 'value2' from dual -- + some additional magic

Я ищу способ не PL / SQL, который, как мне кажется, излишним, но я ' Я не говорю «нет» PL / SQL, если это единственный вариант, но я могу посмотреть здесь Создать функцию Oracle, которая возвращает таблицу для вдохновения для PL / SQL. Но дополнительная таблица с списком, кажется, все еще легче поддерживать, чем PL / SQL.

Мотивация не использовать select distict из транзакционной таблицы состоит в том, что я хочу иметь определенный список значений, и с при таком подходе я могу пропустить те, которые ожидаю, но не имею записей в таблице.

Ожидаемое количество элементов в списке составляет несколько десятков записей (например, 30).

Ответы [ 5 ]

2 голосов
/ 25 марта 2020

Если вы не используете 12 c и не можете использовать json_table (или даже если вы / можете, но не хотите), вы можете использовать последовательность XML через xmltable вместо этого:

select *
from xmltable('"value1", "value2", "value3"');

Result Sequence                                                                 
--------------------------------------------------------------------------------
value1
value2
value3

Я бы, вероятно, использовал коллекцию ODCI по умолчанию, но может быть интересно сравнить, как все эти опции сравниваются с большими объемами данных - с 30 значениями вы не сможете увидеть большую часть разница.

2 голосов
/ 25 марта 2020

Начиная с Oracle 12 c вы можете использовать JSON_TABLE для этого:

select *
from json_table('["value1", "value2"]', '$[*]' 
                 columns val varchar(20) path '$');
2 голосов
/ 25 марта 2020

Или еще один, похожий:

SQL> select column_value
  2  from table(sys.odcivarchar2list('Little', 'Foot', 'Scott', 'Tiger'))
  3  order by column_value;

COLUMN_VALUE
----------------------------------------------------------------------------
Foot
Little
Scott
Tiger

SQL>
2 голосов
/ 25 марта 2020

Вот один из вариантов:

select column_value 
from table(sys.dbms_debug_vc2coll('value1', 'value2', 'value3', 'value4'));

Начиная с Oracle 12.2, вам не нужна функция table:

select column_value 
from sys.dbms_debug_vc2coll('value1', 'value2', 'value3', 'value4');
1 голос
/ 25 марта 2020

Также вы можете использовать соединение по запросу:

SQL> select regexp_substr('VALUE1,VALUE2','[^,]+', 1, level) from dual
  2     connect by level <= regexp_count('VALUE1,VALUE2', '[^,]+');

REGEXP_SUBSTR('VALUE1,VALUE2','[^,]+',1,LEVEL)
----------------------------------------------------
VALUE1
VALUE2

SQL>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...