我知道这个问题似乎有点基本但我想确保我得到正确的语法,因为这行代码会经常运行:
我希望对表格“字母表”中的A,B和C列汇总,这些行包含在我的IN子句中。
我会这样做,但如果可能的话我想要确认:
SELECT SUM(A + B + C) as "subtotal" FROM alphabet WHERE id IN ('1','5','378');
答案 0 :(得分:9)
如果id
不是字符串,则不应引用这些值。
SELECT SUM(A + B + C) as "subtotal" FROM alphabet WHERE id IN (1,5,378);
这应该有用,但可能有一个非显而易见的后果。如果任何行A
不为空且其中一个为空,则该行将退出求和,因为null加上任何其他值为null,并且SUM
运算符忽略空值。因此,写作可能更安全:
SELECT SUM(A) + SUM(B) + SUM(C) as "subtotal" FROM alphabet WHERE id IN (1,5,378);
这会遇到同样的潜在问题,但不太可能发生,因为整个列必须为空。如果您仍然担心,有各种方言特定的方法来抵御这个问题。最便携的是痛苦的冗长:
SELECT SUM(
CASE
WHEN A IS NULL
THEN 0
ELSE A
END
+
CASE
WHEN B IS NULL
THEN 0
ELSE B
END
+
CASE
WHEN c IS NULL
THEN 0
ELSE C
END
) as "subtotal"
FROM alphabet
WHERE id IN (1,5,378);
答案 1 :(得分:1)
“经常跑步”表明性能将成为一个问题。如果这是真的,请确保id上有索引。如果它是主键,默认情况下它会有一个索引。
如果您没有索引,您最终会进行表扫描 - 检查每一行。随着表格规模的增长,性能会变差。
对您的查询执行EXPLAIN PLAN,并确保在任何地方都看不到TABLE SCAN。
答案 2 :(得分:0)
declare
@a int = 0,
@b int = 5,
@c int = NULL
select
ISNULL(@a, 0) + ISNULL(@b, 0) + ISNULL(@c, 0)