Sql Oracle从IN子句中选择数字
我正在寻找直接从in子句中选择数字的最佳方法 基本上像: 那不行。我可以这样做:Sql Oracle从IN子句中选择数字,sql,oracle,Sql,Oracle,我正在寻找直接从in子句中选择数字的最佳方法 基本上像: 那不行。我可以这样做: 但这似乎有点笨重。还有更优雅的方法吗?如果不明确需要IN子句,可以使用UNION: SELECT * FROM (2,6,1,8); 有一种更优雅的变体可以将多行插入表中: SELECT Lv FROM ( SELECT Level LV FROM DUAL CONNECT BY Level < 20) WHERE Lv IN (2
但这似乎有点笨重。还有更优雅的方法吗?如果不明确需要IN子句,可以使用UNION: SELECT * FROM (2,6,1,8); 有一种更优雅的变体可以将多行插入表中: SELECT Lv FROM ( SELECT Level LV FROM DUAL CONNECT BY Level < 20) WHERE Lv IN (2,6,1,8);
但是我不知道如何为SELECT实现这一点。如果将辅助数字表具体化,则更为优雅:
select 2 from dual
union
select 6 from dual
union
select 1 from dual
union
select 8 from dual
这在与另一个表结合时也很有用
例如,我曾经遇到过这样一种情况:我需要使用分段结果的更改填充大型配置表:
大SP或Excel工作表或报表可识别配置中缺少的成本中心,并提供大量结果,需要在某些组中插入不同的数据
将部分结果粘贴到单个逗号分隔的列表中:
INSERT ALL
INTO table (col) VALUES ('a')
INTO table (col) VALUES ('b')
INTO table (col) VALUES ('c')
SELECT * FROM dual;
你能行
SELECT num FROM numbers WHERE num IN (2,6,1,8);
但这实际上返回了一个varchar2。您可以创建自己的类型并使用它
INSERT INTO {stuff}
SELECT {stuff}, 130 as line_item
FROM numbers
WHERE numbers.num IN ({pasted a section of results})
INSERT INTO {stuff}
SELECT {stuff}, 135 as line_item
FROM numbers
WHERE numbers.num IN ({pasted another section of results})
还值得一看示范条款。它看起来很复杂,但它非常擅长生成数据
select column_value from table(sys.dbms_debug_vc2coll(1,2,3,4,5));
这样做是否有一个特别的问题需要解决?它实际上是一次性的pl/sql执行。在某些数字上生成循环等等。好主意。我以前在所有_对象中都使用过RowNum,但感觉不太对劲。这里的数字表有什么用?难道不能从{big construct}写入{selection of results}中的cost_center吗?将所有数字存储在一个数字表中会浪费磁盘空间,并且与OP建议的按级别<20从双连接查询SELECT Level没有明显的好处。事实上,它的效率会低一些,因为Oracle仍然会从磁盘上读取数字表的所有数据块。对不起,更准确地说,Oracle仍然会从磁盘或缓存中读取所有数据块。@Jeffrey Kemp:当然,我总是有一个数字表,并将其用于生成数据之类的所有事情,为差距分析等生成连续的数值范围。当然,适当索引。我主要在SQL Server上工作,这个问题与我最近不得不分几批进行的一些插入密切相关。
create type tab_num is table of number;
/
select column_value from table(tab_num(1,2,3,4,5));
SELECT x from dual
MODEL DIMENSION BY (1 AS z) MEASURES (1 x)
RULES ITERATE (7) (x[ITERATION_NUMBER]=ITERATION_NUMBER+1)