2017-02-22 5 views
1

私の同僚は、次の文脈でIIFの使用がわかりにくいと判断しました。可読性を高めるためにON句にIIFを使用する代わりに

読みやすい代替アプローチはありますか?

あなただけのより良い論理 or演算子、または使用することができ
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

あなたはそれを明確t.brのいずれかであることを確認するためにORを使用することができます

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

以上簡潔に:

ALLまたはc.brに等しいと等しいです
AND t.br in ('ALL', c.br) 
+0

私はこれを自分自身の答えより良くしています。 +1。 –

+0

'AND t.br in( 'ALL'、c.br)'は私が使用するものです - はるかに読み込み可能です – whytheq

2

- 短期手にそれを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

IIFCASEの構文砂糖です。このようにon節を書くことができます:

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

通常、特定のケース(f.e. "all")を識別するためにNULLを使用します。したがって、コードは次のようになります。

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

関連する問題