值列表为 table

List of values as table

我正在寻找一种更智能的方法来在 Oracle 中将值列表作为 table。

我现在做的是

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

我希望的是一些 function/way/magic,例如我会做的

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

我正在寻找 non-PL/SQL 我认为有点矫枉过正的方法,但如果那是唯一的选择,我不会对 PL/SQL 说绝对不,但我可以看这里 Create an Oracle function that returns a table 为 PL/SQL 提供灵感。但是额外的 table 似乎比 PL/SQL.

更容易维护。

不使用事务性 table 中的 select distict 的动机是我想要一个定义的值列表,使用这种方法,我可能会错过那些我期望但没有记录的值在 table.

列表中的预期元素数是几十条记录(比如 30 条)。

这是一个选项:

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');

或另一个类似的:

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>

另外,您可以使用查询连接:

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>

从 Oracle 12c 开始,您可以使用 JSON_TABLE

select *
from json_table('["value1", "value2"]', '$[*]' 
                 columns val varchar(20) path '$');

如果您不在 12c 上并且不能使用 json_table(或者即使您 are/can 但不想使用),您可以使用 XML 序列通过xmltable 改为:

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

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

我可能会默认使用 ODCI 集合,但将所有这些选项与大数据量进行比较可能会很有趣 - 使用 30 个值你可能看不出太大差异。