2016-05-23 160 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」條款! :○ –