【问题标题】:Converting IIF to CASE Statement (Error in THEN & ELSE Statements)将 IIF 转换为 CASE 语句(THEN 和 ELSE 语句中的错误)
【发布时间】:2016-05-23 14:21:59
【问题描述】:

这是 IIF 格式的查询。

SELECT [userinfo].[dp_url]
    ,[message_threads].[thread_id]
    ,[userinfo].[fname]
    ,[userinfo].[lname]
    ,[userinfo].[profile_id]
FROM [message_threads]
LEFT JOIN [userinfo] ON (IIF([message_threads].[from] <> 2, [userinfo].[profile_id] = [message_threads].[from], [userinfo].[profile_id] = [message_threads].[to]))
WHERE (IIF([message_threads].[from] <> 2, [to] = 2, [from] = 2))
ORDER BY [last_updated_on] DESC

这是迄今为止我对 CASE 声明所做的。

SELECT [userinfo].[dp_url]
    ,[message_threads].[thread_id]
    ,[userinfo].[fname]
    ,[userinfo].[lname]
    ,[userinfo].[profile_id]
FROM [message_threads]
LEFT JOIN [userinfo] ON (
        CASE 
            WHEN ([message_threads].[from] <> 2)
                THEN ([userinfo].[profile_id] = [message_threads].[from])
            ELSE ([userinfo].[profile_id] = [message_threads].[to])
            END
        )
WHERE (
        CASE 
            WHEN ([message_threads].[from] <> 2)
                THEN ([to] = 2)
            ELSE ([from] = 2)
            END
        )
ORDER BY [last_updated_on] DESC

我收到以下错误:

Msg 102, Level 15, State 1, Line 1
Incorrect syntax near '='.

使用等于(=)是非常有必要的。

感谢任何帮助!

【问题讨论】:

  • 看看这个:stackoverflow.com/questions/10256848/…。您的 CASE 需要返回 1 或 0,然后比较变为 AND
  • 括号里是什么意思?
  • @HoneyBadger 我是 CASE 语句的新手。我认为这就是你压缩条件的方式。

标签: sql sql-server case iif


【解决方案1】:

CASE 是一个返回值的表达式,不用于程序流程,因此您可以将您的案例重新排列为:

LEFT JOIN [userinfo]
    ON [userinfo].[profile_id] = (
        CASE 
            WHEN ([message_threads].[from] <> 2)
                THEN ([message_threads].[from])
            ELSE ([message_threads].[to])
            END
    )
WHERE 2 = (
    CASE 
        WHEN ([message_threads].[from] <> 2)
            THEN ([to])
        ELSE ([from])
        END
    )

另一种方法是将其转换为布尔条件:

LEFT JOIN [userinfo] ON 
    ([message_threads].[from] <> 2 AND [userinfo].[profile_id] = [message_threads].[from])
    OR 
    ([message_threads].[from] = 2 AND [userinfo].[profile_id] = [message_threads].[to])

WHERE 也是如此

【讨论】:

    【解决方案2】:

    尽量不要使用条件进行比较。通常,ANDOR 就足够了:

    SELECT . . .
    FROM [message_threads] LEFT JOIN
         [userinfo]
         ON ([message_threads].[from] <> 2 AND [userinfo].[profile_id] = [message_threads].[from]) OR
            ([message_threads].[from] = 2 AND [userinfo].[profile_id] = [message_threads].[to])
    WHERE 2 IN ([from], [to])
    

    注意:我简化了WHERE。如果过于简化,可以使用:

    WHERE ([message_threads].[from] <> 2 AND [to] = 2) OR
          ([message_threads].[from] - 2 AND [from] = 2)
    

    为了便于阅读,我还强烈建议使用表别名:

    SELECT . . .
    FROM message_threads mt LEFT JOIN
         userinfo ui
         ON (mt.[from] <> 2 AND ui.profile_id = mt.[from]) OR
            (mt.[from] = 2 AND ui.profile_id = mt.[to])
    WHERE 2 IN ([from], [to])
    

    此外,您应该使用保留字,例如 fromto 作为列名。

    【讨论】:

    • 感谢您的回答。改用简化的WHERE 子句更有意义。在我们说话的时候,我还在了解 SQL,我也不知道 IN 子句! :o
    猜你喜欢
    • 1970-01-01
    • 2018-09-05
    • 2020-11-23
    • 1970-01-01
    • 1970-01-01
    • 2019-04-09
    • 1970-01-01
    • 2022-01-01
    • 1970-01-01
    相关资源
    最近更新 更多