2013-02-22 89 views
1

我有很多文本數據必須用作從數據庫返回其他數據的關鍵字。問題是有些鍵不存在。他們詢問我要找應該返回空行對他們來說在where子句中選擇行並保留文本順序

select column1, column2,column3 from mobilenumbers where mobile_number in ('123456789','123456798'); 

到目前爲止,我已經找到了唯一的方法是使用一個右外連接,然而,僅適用於兩個表,我有一個表格和文本數據作爲鑰匙。

而且有人問之前......我不能創建一個表來把這個數據。

如果有幫助,這是Oracle 10g數據庫。

回答

3

你可以這樣做。

首先,獲取您的選擇的公共varrray ..theres通常不少。

--pick a public VARRAY. 
select owner, type_name from all_Coll_types where coll_type = 'VARYING ARRAY' 
and elem_type_name = 'VARCHAR2' ; 

然後選擇保持你的列表的順序:

with numbers as (select /*+ cardinality(t, 10) */ rownum r, t.column_value pnumber 
    from table(sys.dbmsoutput_linesarray('030390483', '089847547', '0347839874', '020983438')) t 
) 
select n.pnumber, m.mobile_number 
    from numbers n 
     left outer join mobilenumbers m 
        on n.pnumber = m.mobile_number 
order by n.r; 

如:http://sqlfiddle.com/#!4/9da70/1

+0

我認爲你是對的,但這種行爲記錄?你能證明它總是被排序嗎?或者你的查詢有可能是幸運的?你可能想看看這個類似的問題,雖然我不認爲那裏的答案真的解決了這個問題:http://stackoverflow.com/q/13987855/409172 – 2013-02-23 05:15:58

+0

謝謝。最終在PL/SQL塊中做類似的事情。最後,我必須處理25000個條目。帶上dba的! – Gerrie 2013-02-23 05:34:51

+2

@jonearles varrays有記錄的順序[這裏](http://docs.oracle.com/cd/E11882_01/server.112/e26088/sql_elements001.htm#SQLRF51007)和[here](http://docs.oracle.com)。 com/cd/B28359_01/appdev.111/b28370/collections.htm#i35815)(事實上,我甚至會說,當存儲在內存中的嵌套表時,順序不應該改變..只有當它放入磁盤時在NT上最好)。也是的,接受的答案根本就不對,因爲他們使用'union',它在傳遞給表構造函數之前會重新排序數組(它的結果正是我期望的,因爲您看到它被命名爲字符明智)。 – DazzaL 2013-02-24 01:59:40

0

這是相當醜陋,但你可以嘗試:

SELECT column1, column2, column3 
FROM (SELECT 1 FROM DUAL) x 
LEFT OUTER JOIN mobilenumbers ON mobile_number = '123456789' 
UNION ALL 
SELECT column1, column2, column3 
FROM (SELECT 1 FROM DUAL) x 
LEFT OUTER JOIN mobilenumbers ON mobile_number = '123456798' 

SQL Fiddle example

或者,你可以使用這一招,但它可能無法維持秩序,你在指定的號碼:

SELECT column1, column2, column3 
FROM TABLE(sys.odcivarchar2list('123456789','123456798')) x 
LEFT OUTER JOIN mobilenumbers m ON x.COLUMN_VALUE = m.mobile_number 

SQL Fiddle example

+0

2500個手機號碼,它的將是所有查詢的母親......和可能降落我在thedailywtf.com :-) – Gerrie 2013-02-22 05:23:00

+0

@Gerrie非常真實,雖然我不確定你有沒有很多的選擇,如果你不能創建一個表。我確實增加了一個解決方案,但它可能不會像您在標題中所要求的那樣保留您的訂購。 – 2013-02-22 05:44:09

+2

@Gerrie:你不能擁有2500個元素的IN操作符。 Oracle中的最大值是1000。 – 2013-02-22 08:47:19