2010-09-22 43 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所建议的。