2016-05-23 157 views
0

这是IIF格式的查询。将IIF转换为CASE语句(THEN&ELSE语句中的错误)

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 '='. 

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

任何帮助表示赞赏!

+0

看看这个:http://stackoverflow.com/questions/10256848/can-i-use-case-statement-in-a-join-condition。您的CASE需要返回1或0,然后比较结果变为AND – GinjaNinja

+0

括号中的内容是什么? – HoneyBadger

+0

@HoneyBadger我是“CASE”语句的新手。我认为这就是你压缩条件的方式。 –

回答

1

的情况是返回一个值,不用于程序流程中表达,所以你可以只是重新安排你的案件:

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

+0

非常感谢你!这完美的作品! :D –

0

尽量不要使用条件进行比较。通常情况下,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列名。

+0

谢谢你的回答。相反,使用简化的'WHERE'子句更有意义。当我们说话时,我仍然知道SQL,我也不知道“IN”条款! :○ –