值列表为 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 个值你可能看不出太大差异。
我正在寻找一种更智能的方法来在 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 个值你可能看不出太大差异。