2017-02-22 9 views
1

Мой коллега считает использование IIF в следующем контексте сложным для понимания.Альтернатива использованию IIF в позиции ON для повышения удобочитаемости

Есть ли более читаемый альтернативный подход?

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 
C.OP = T.OP AND 
C.BR = CASE WHEN T.BR = 'ALL' THEN C.BR ELSE T.BR END 
1

Я обычно использую NULL для выявления конкретных случаев (F.E. «все»). Таким образом, код может выглядеть так:

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

Смежные вопросы