2012-01-03 81 views
0

如何從Oracle 10g中的類型集中進行選擇?從打印的集合中選擇

I.E. SELECT * FROM (3,5,20,68,54,13,56,899,1)

此外,我將如何過濾它?

I.E. SELECT * FROM (3,5,20,68,54,13,56,899,1) WHERE > 5

回答

2

數據從哪裏來,您打算如何處理它?

如果正在從文件中讀取數據,通常需要創建一個外部表來從文件中讀取數據,或使用SQL * Loader或其他ETL工具將數據裝載到臨時表或PL/SQL集合中你可以再查詢

SQL> create type num_tbl is table of number; 
    2/

Type created. 

SQL> ed 
Wrote file afiedt.buf 

    1 declare 
    2 l_nums num_tbl := num_tbl(3, 5, 20, 68, 54); 
    3 begin 
    4 for x in (select * from table(l_nums)) 
    5 loop 
    6  dbms_output.put_line(x.column_value); 
    7 end loop; 
    8* end; 
SQL>/
3 
5 
20 
68 
54 

如果你正在做某種手工工藝,你通常會從另一個表尋找數據,即

SELECT * 
    FROM some_other_table 
WHERE some_key IN (3, 5, 20, 68, 54, 13, 56, 889, 1); 

如果你真的想產生一個充滿任意數據的數據集,這些數據是從你不知道的文件中提取的螞蟻使用Oracle閱讀,你總是可以做一系列來自DUALSELECT陳述,它們都是UNION ALL'd在一起,但是這顯然變得相當麻煩。

WITH sample_data 
    AS (SELECT 3 num FROM dual UNION ALL 
     SELECT 5 FROM dual UNION ALL 
     SELECT 20 FROM dual UNION ALL 
     SELECT 68 FROM dual UNION ALL 
     SELECT 54 FROM dual UNION ALL 
     ... 
     SELECT 1 FROM dual) 
SELECT * 
    FROM sample_data 
    WHERE num > 5; 

此外,使用WITH子句和CSV字符串我們可以將字符串解析爲表。 實施例:

VARIABLE liste VARCHAR2(100) 

EXECUTE :liste := '5, 25, 41, 52'; 

WITH liste AS (
    SELECT SUBSTR(:liste, INSTR(','||:liste||',', ',', 1, rn), 
    INSTR(','||:liste||',', ',', 1, rn+1) - 
    INSTR(','||:liste||',', ',', 1, rn)-1) valeur 
FROM (
    SELECT ROWNUM rn FROM DUAL 
    CONNECT BY LEVEL<=LENGTH(:liste) - LENGTH(REPLACE(:liste,',',''))+1)) 
SELECT TRIM(valeur) 
FROM liste; 
+0

1-10只是我提供的隨機樣本,實際使用將是非常在可預測的模式非常不同和不。它大約有900個9位數字。數據正在從日誌文件中提取的數據中複製和粘貼。 – Malfist 2012-01-03 19:44:31

+0

@Malfist - 我更新了我的答案,以討論您的選擇,如果您不試圖以編程方式生成數據。 – 2012-01-03 20:05:17

+0

發生了什麼是有一堆提交錯誤,所以我有一堆應該是我需要驗證的主鍵ID實際上不在數據庫中。所以第二個建議是行不通的。 – Malfist 2012-01-03 20:59:20