我寫匹配他們與客戶數據庫輸入電話號碼列表的用戶解決方案的一部分。試圖生成從報表
用戶需要輸入一個逗號分割的電話號碼(整數)的名單,並查詢需要告訴它從他們的名單的電話號碼是不是在數據庫中的用戶。
我能想到的要做到這一點,首先創建一個子集NUMBER_LIST,包括所有的電話號碼,我可以加入,然後從我帶回從我的客戶數據庫排除列表的唯一途徑。
WITH NUMBER_LIST AS (
SELECT INTEGERS
FROM (
SELECT level - 1 + 8000000000 INTEGERS
FROM dual
CONNECT BY level <= 8009999999-8000000000+1
)
WHERE INTEGERS IN (80,80,80,80,...up to 1000 phone numbers)
)
這裏的問題是上述代碼工作正常,爲800-000-0000和800-999-9999之間的數字創建我的子集。我的列表和客戶數據庫中的電話號碼可以是任意範圍(不只是800個數字)。我只是做了一個測試。從該查詢生成子集大約需要6秒。如果我創建CONNECT BY LEVEL來包含從100-000-0000到999-999-9999的所有數字,這些數字正在運行我的內存查詢以創建一個很大的子集(並且我認爲創建一個巨大的列表是可笑的矯枉過正並使用我的IN語句將其分解)。
問題是創建初始子集。我可以處理查詢的其餘部分,但我需要能夠生成數字的子集,以便從我的IN語句中查詢我的客戶數據庫。
幾件事情要記住:
- 我不必在臨時表中首先加載數字的能力。用戶將自己輸入「IN(...,...,...)」語句。
- 這需要是單個語句,不需要額外的函數或變量聲明
- 數據庫是Oracle 10g,我正在使用SQL Developer創建查詢。
- 用戶理解他們只能在IN語句中輸入1000個數字。這需要足夠強大,以從整個地區代碼範圍中選擇任意1000個號碼。
- 最終結果是獲取不在數據庫中的電話號碼列表。一個簡單的NOT IN ...將不起作用,因爲這將返回哪些數字在數據庫中,但不在我的列表中。
如何使這項工作適用於1000000000-9999999999(或所有美國10位數電話號碼可能性)之間的所有號碼。我可能會在完全錯誤的情況下生成我的初始HUGE列表,然後排除除IN語句之外的所有內容,但我不確定從哪裏開始。
非常感謝您的幫助。我從你們所有人那裏學到了很多東西。
您可以嘗試添加之間的限制內必須通過的範圍。 WHERE INTEGER BETWEEN lowest_number和highest_number –