2009-05-18 96 views
2

我正在尋找直接從in子句中選擇數字的最佳方法。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); 

但是,這似乎有點笨重。有沒有更優雅的方式?

+0

是否有一個特定的問題要通過這樣做來解決? – mmorrisson 2009-05-18 19:34:16

+0

這確實是一次性的pl/sql執行。在某些數字等上生成循環。 – 2009-05-18 21:45:08

回答

1

如果你兌現輔助號碼錶這是更優雅:

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

,這也是有用的,當與另一個表結合。

舉例來說,我已經在那裏我需要填充大量的配置表從分段成績變化情況:

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

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)