我正在寻找直接从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);
但这似乎有点笨拙。有更优雅的方式吗?
答案 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做这件事。