替代在 ON 子句中使用 IIF 以提高可读性
Alternative to using IIF in ON clause to increase readability
我的同事发现 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
您可以只使用逻辑 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
可以用OR
来明确t.br等于ALL或者等于c.br:
AND (t.br = 'ALL' or c.br = t.br)
或更简洁:
AND t.br in ('ALL', c.br)
IIF
是 CASE
的语法糖。你可以这样写你的 on 子句:
ON
C.OP = T.OP AND
C.BR = CASE WHEN T.BR = 'ALL' THEN C.BR ELSE T.BR END
我一般用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
我的同事发现 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
您可以只使用逻辑 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
可以用OR
来明确t.br等于ALL或者等于c.br:
AND (t.br = 'ALL' or c.br = t.br)
或更简洁:
AND t.br in ('ALL', c.br)
IIF
是 CASE
的语法糖。你可以这样写你的 on 子句:
ON
C.OP = T.OP AND
C.BR = CASE WHEN T.BR = 'ALL' THEN C.BR ELSE T.BR END
我一般用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