SELECT查询中的IF-ELSE

时间:2015-01-06 17:46:46

标签: sql-server

以下是我要做的事情:

SELECT
TBL1.Name,
TBL2.ID,
(
    IF TBL2.ID = 'X'
    SELECT TBL3.Addr
    FROM TBL3
    WHERE TBL3.ID = TBL2.ID
    ELSE
    SELECT TBL4.Room
    FROM TBL4
    WHERE TBL4.ID = TBL2.ID
)
AS Location
FROM TBL1
INNER JOIN TBL2
ON TBL1.ID = TBL2.ID
INNER JOIN TBL3
ON TBL2.ID = TBL3.ID

从上面的代码中你可以看到类似于我想要做的事情。我只想从两个不同的表中选择,具体取决于TBL2.ID是'X'还是'Rm'或'St'等。如果我能够正常工作,我可以稍后担心其他值。

我尝试了什么(只是发布我遇到问题的()之间的文章:

(
    SELECT CASE
    WHEN TBL2.ID = 'X'
    THEN
    SELECT TBL3.Addr FROM TBL3 WHERE TBL3.ID = TBL2.ID
    ELSE
    SELECT TBL4.Room FROM TBL4 WHERE TBL4.ID = TBL2.ID
    END
) AS Location

这会产生错误: 无法绑定多部分标识符“TBL2.ID”。 “SELECT”附近的语法不正确。

问题:如何在另一个选择查询中编写if-else语句/ case语句?

3 个答案:

答案 0 :(得分:2)

如果TBL3.AddrTBL4.Room可用且另一个总是丢失,请考虑改为:

SELECT
    TBL1.Name,
    TBL2.ID,
    COALESCE(TBL3.Addr, TBL4.Room) AS Location
FROM
    TBL1
    INNER JOIN TBL2
        ON TBL1.ID = TBL2.ID
    LEFT JOIN TBL3
        ON TBL2.ID = TBL3.ID
    LEFT JOIN TBL4
        ON TBL2.ID = TBL4.ID

请参阅:COALESCE (Transact-SQL)

答案 1 :(得分:1)

case statement将返回scalar value您无法编写select内部案例陈述。将您的TBL4移至Join请尝试此操作。

SELECT
TBL1.Name,
TBL2.ID,
case when TBL2.ID = 'X' then TBL3.Addr else TBL4.Room end AS Location
FROM TBL1
INNER JOIN TBL2
ON TBL1.ID = TBL2.ID
INNER JOIN TBL3
ON TBL2.ID = TBL3.ID
inner join TBL4 on TBL4.ID = TBL2.ID

答案 2 :(得分:1)

只需引用CASE声明

中的列名称即可
SELECT
TBL1.Name,
TBL2.ID,
(
    CASE WHEN TBL2.ID = 'X' THEN 
      TBL3.Addr
    ELSE
      TBL4.Room
    END
)
AS Location
FROM TBL1
INNER JOIN TBL2 ON TBL1.ID = TBL2.ID
INNER JOIN TBL3 ON TBL2.ID = TBL3.ID
INNER/LEFT JOIN TBL4 ON TBL2.ID = TBL4.ID