2010-09-22 66 views
1

有沒有辦法從IN子句中檢索所有數據?返回SQL Server 2000中IN子句的所有值

讓我們假設我的桌邊站(ID,姓名):

0 Banana
1 Mango
2 Papaya
3 Lemon

和我的查詢:

SELECT * FROM Fruits WHERE Name IN (Banana,Mango,Orange) 

我想 '橙' 到返回一個空ID(因爲沒有寄存器)。這個怎麼做?

回答

5

對此,您不能使用IN子句。您需要將目標水果放入可以外連接的表格中。

SELECT ... 
FROM 
(SELECT 'Banana' AS fruit UNION ALL SELECT 'Mango' UNION ALL SELECT 'Orange') f 
LEFT JOIN Fruits ON Fruits.Name = f.fruit 

或選項2(只要您的列表是< = 8000個字符)。創建一個UDF like the one here(但使用varchar(8000)而不是varchar(max))。然後如下使用它。

SELECT ... 
FROM dbo.fnSplitStringList('Banana,Mango,Orange') f 
LEFT JOIN Fruits ON Fruits.Name = f.StringLiteral 
+1

+1 - 比我試圖寫的更好:) – JNK 2010-09-22 13:00:38

+0

好吧,讓我們假設我有超過1500個寄存器,這是一個更好的方法來做到這一點? – alex 2010-09-22 13:01:15

+1

@alex - 您可以將它們作爲逗號分隔列表傳遞並使用拆分表值函數(例如[dbo.fnSplitStringList](http://www.sqlusa.com/bestpractices/training/scripts/userdefinedfunction/))然後你加入反對。或者可能將它們傳遞給XML。不知道該選項的SQL2000支持是什麼樣的。 – 2010-09-22 13:02:53

0

通過名稱進行正確連接,但需要帶名稱的單獨表格。

0

如果你這樣做了一次,我寫了一個程序,它簡化了創建「IN」子句,這裏:InClauseCreator。但是,如果你經常這樣做,那麼你最好將數據導入臨時表,然後進行左連接,接近Martin Smith所建議的。