Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql Oracle从IN子句中选择数字_Sql_Oracle - Fatal编程技术网

Sql Oracle从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子句中选择数字的最佳方法

基本上像:

那不行。我可以这样做:


但这似乎有点笨重。还有更优雅的方法吗?

如果不明确需要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)