SQL中是否可以在From子句中使用Case语句?

27

在SQL 2005中,是否可以在SQL From子句中使用Case语句?例如,我正在尝试类似以下的内容:

SELECT Md5 FROM 
CASE
    WHEN @ClientType = 'Employee' THEN @Source = 'HR'
    WHEN @ClientType = 'Member' THEN  @Source = 'Other'
END CASE 
WHERE Current = 2;
5个回答

30
我不相信这是可能的。首先,查询优化器假设FROM子句中有一个特定的类似表格的事物列表。
我能想到的最简单的解决方法是在两个表之间使用 UNION :
SELECT  md5
FROM    hr
WHERE   @clienttype = 'Employee'
AND     current = 2
UNION
SELECT  md5
FROM    other
WHERE   @clienttype = 'Member'
AND     current = 2;

鉴于@clienttype谓词,联合查询只有其中一半可能为真。


我通常会写一个if语句,但是当将这种策略与“插入到”结合使用时,它可以避免我多次编写插入部分,我喜欢这个解决方案,谢谢,以后尽可能会这样做。 :) - Taylor Brown
1
请注意,WHERE条件将针对表中的每一行执行。因此,如果条件比较复杂并且有数百万行,则可能不是一个选项。 - Alex Klaus

8

假设使用的是SQL Server:

你需要使用动态SQL。构建字符串,然后使用该字符串调用sp_executesql。

编辑:最好的方法是,使用if语句来执行适当的语句,并将值赋给一个变量。如果可能的话,应避免使用动态SQL。


6

不,你不能使用CASE语句选择要查询的表。CASE语句只能用在表达式中,例如作为列的值或作为WHERE表达式的一部分。

如果你只是想查找一个值,可以尝试以下方法:

IF @ClientType = 'Employee' BEGIN
    SET @Source = (SELECT Md5 FROM HR WHERE Current = 2)
END
ELSE IF @ClientType = 'Member' BEGIN
    SET @Source = (SELECT Md5 FROM Other WHERE Current = 2)
END

尽管这样做有些繁琐,但这是我会采取的方法(但没有投票的机会 :-/)。我更愿意使用工具静态生成SQL(这只需要3行Ruby或1行Perl? :-)),而不是处理动态SQL(当我需要动态SQL时,我发现自己对需要动态SQL感到非常厌恶)。 - user166390

0

由于您没有指定要使用哪个SQL后端,因此很难给出正确的答案...

据我所知,无论是针对MS SQL Server还是Interbase/Firebird,您都无法做到这一点。不过,我无法代表其他后端服务器发言...

Marc


0

我认为可以非常肯定地说,答案绝对是否定的。不管使用哪种 SQL 方言。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接