【问题标题】:List of values as table作为表格的值列表
【发布时间】:2023-03-29 01:35:02
【问题描述】:

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

我现在做的是

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

我希望的是一些功能/方式/魔法,例如我会做的

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

我正在寻找非 PL/SQL 方式,我认为这太过分了,但如果这是唯一的选择,我并没有绝对拒绝 PL/SQL,但我可以在这里查看 Create an Oracle function that returns a table 以获取 PL 的灵感/SQL。但是额外的表有一个列表似乎比 PL/SQL 更容易维护。

不使用事务表中的select distict 的动机是我希望有一个已定义的值列表,并且通过这种方法,我可能会错过那些我期望的但表中没有记录的值。

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

【问题讨论】:

标签: sql database oracle csv oracle12c


【解决方案1】:

或者另一个类似的:

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>

【讨论】:

  • 谢谢,为我工作。我不需要维护的 PL/SQL 比我想象的要好。
  • 我必须选择一个“赢家”,所以我选择了这个。 Here 作者说 odcivarchar2list is not good, because it chews a lot of memory 这对我来说没问题(值的短列表)。
  • 在我的情况下,我询问了字符串(Oracle DB 中的 varchar),还有 OdciNumberList 用于数字...
  • 是的,有-但是,正如您所说,您询问了字符串。这些内置类型有时很方便(就像您的情况一样),因为您不必创建自己的类型。
【解决方案2】:

这是一种选择:

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

【讨论】:

  • 谢谢,为我工作。我不需要维护的 PL/SQL 比我想象的要好。
【解决方案3】:

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

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

【讨论】:

  • 如果不是字符串列表而是对象列表,这将是我的首选 - select * from json_table('[ {foo: 1, bar: "value1"}, {foo: 2, bar: "value2"} ]', '$[*]' columns foo number path '$.foo', bar varchar2(20) path '$.bar');
【解决方案4】:

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

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

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

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

【讨论】:

  • 谢谢,有数百条记录我会使用额外的表,这可能会帮助将来的人......我在 Oracle 12c 上(我也没有提到)。
  • 嗯,这也适用于以后的版本...我没有说得很好*8-)
【解决方案5】:

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

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>

【讨论】:

  • 谢谢,这也有效,但目前我更喜欢其他两个选项(使用 PL/SQL),因为对我来说它更容易阅读。我知道我提到了有问题的非 PL/SQL 方式,希望您理解...
猜你喜欢
  • 2017-01-09
  • 1970-01-01
  • 2021-09-22
  • 1970-01-01
  • 2021-11-01
  • 2021-12-05
  • 1970-01-01
  • 1970-01-01
  • 2016-12-29
相关资源
最近更新 更多