Oracle从IN子句中选择数字

时间:2009-05-18 18:47:17

标签: sql oracle

我正在寻找直接从in子句中选择数字的最佳方法。

基本上像:

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

但这似乎有点笨拙。有更优雅的方式吗?

3 个答案:

答案 0 :(得分:3)

你可以做到

select column_value from table(sys.dbms_debug_vc2coll(1,2,3,4,5));

但实际上返回了varchar2。您可以创建自己的TYPE并使用

create type tab_num is table of number;
/
select column_value from table(tab_num(1,2,3,4,5));

同样值得看一下MODEL子句。它看起来很复杂,但它非常擅长生成数据

SELECT x from dual
MODEL DIMENSION BY (1 AS z) MEASURES (1 x)
  RULES ITERATE (7) (x[ITERATION_NUMBER]=ITERATION_NUMBER+1)

答案 1 :(得分:1)

如果你实现一个辅助数字表,那就更优雅了:

SELECT num FROM numbers WHERE num IN (2,6,1,8);

当与另一个表结合使用时,这也很有用。

例如,我有一个案例,我需要使用分段结果的变化来填充大型配置表:

Big SP或Excel工作表或报告在配置中标识缺少的成本中心,提供了大量结果,需要在某些组中插入不同的数据。

将部分结果粘贴到单独的逗号分隔列表中:

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})

答案 2 :(得分:0)

如果您不明确需要IN子句,则可以使用UNION:

  select 2 from dual
  union
  select 6 from dual
  union
  select 1 from dual
  union
  select 8 from dual

将多行插入表中有一个更优雅的变体:

INSERT ALL
   INTO table (col) VALUES ('a')
   INTO table (col) VALUES ('b')
   INTO table (col) VALUES ('c')
SELECT * FROM dual;

但我不知道如何为SELECT做这件事。