Альтернатива использованию 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

4 ответа

Решение

Ты можешь использовать OR чтобы было ясно, что либо t.br равно ALL, либо равно c.br:

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

или более кратко:

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

Вы могли бы просто использовать логическое 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

Я обычно использую 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

IIF является синтаксическим сахаром для CASE, Вместо этого вы можете написать свое предложение:

ON 
C.OP = T.OP AND
C.BR = CASE WHEN T.BR = 'ALL' THEN C.BR ELSE T.BR END
Другие вопросы по тегам