2017-02-22 72 views
1

我的同事發現在以下上下文中使用IIF需要理解。替代在ON子句中使用IIF以提高可讀性

有更可讀的替代方法嗎?

DROP TABLE IF EXISTS #Cas; 
CREATE TABLE #Cas(OP VARCHAR(10), BR VARCHAR(10), SCORE INT) 
INSERT INTO #Cas 
    values 
     ('A','X', 10), 
     ('A','Y', 5), 
     ('B','J', 6), 
     ('C','Q', 50) 

DROP TABLE IF EXISTS #Target; 
CREATE TABLE #Target(OP VARCHAR(10), BR VARCHAR(10)) 
INSERT INTO #Target 
    values 
     ('A','ALL') 

SELECT C.OP, 
     SUM(C.SCORE) 
FROM #Cas C 
     INNER JOIN #Target T 
      ON 
      C.OP = T.OP AND 
      C.BR = IIF(T.BR = 'ALL', C.BR, T.BR) 
GROUP BY C.OP 

回答

2

您可以使用OR要清楚,要麼t.br是等於ALL或等於c.br:

AND (t.br = 'ALL' or c.br = t.br) 

或更簡潔地:

AND t.br in ('ALL', c.br) 
+0

我更喜歡這個,然後是我自己的答案。 +1。 –

+0

'AND t.br in('ALL',c.br)'是我會用的 - 更具可讀性 – whytheq

2

你可以只使用邏輯or運營商,甚至更好 - 一個in運營商速記它:

SELECT C.OP, 
     SUM(C.SCORE) 
FROM #Cas C 
     INNER JOIN #Target T 
      ON 
      C.OP = T.OP AND 
      T.BR IN (C.BR, 'ALL') 
GROUP BY C.OP 
+1

我喜歡這個更好,然後我自己的答案。 +1。 –

+1

'T.BR IN(C.BR,'ALL')'就是我會用的 - 更具可讀性 – whytheq

1

IIF是句法糖CASE。你可以這樣寫你的on子句:

ON 
C.OP = T.OP AND 
C.BR = CASE WHEN T.BR = 'ALL' THEN C.BR ELSE T.BR END 
1

我通常使用NULL來標識特定的情況(f.e.「all」)。所以,代碼可能看起來像:

CREATE TABLE #Cas(OP VARCHAR(10), BR VARCHAR(10), SCORE INT) 
INSERT INTO #Cas 
    values 
     ('A','X', 10), 
     ('A','Y', 5), 
     ('B','J', 6), 
     ('C','Q', 50) 


CREATE TABLE #Target(OP VARCHAR(10), BR VARCHAR(10)) 
INSERT INTO #Target 
    values 
     ('A', NULL) 

SELECT C.OP, 
     SUM(C.SCORE) 
FROM #Cas C 
     INNER JOIN #Target T 
      ON 
      C.OP = T.OP AND 
      C.BR = ISNULL(T.BR, C.BR) 
GROUP BY C.OP 
+0

我們在數據中沒有NULL – whytheq

相關問題