Sql 查询中更干净的case语句?
我在做一个插入,我插入的一个值计算如下:Sql 查询中更干净的case语句?,sql,variables,alias,Sql,Variables,Alias,我在做一个插入,我插入的一个值计算如下: SUM(Value1)/( CASE SUM( CASE Value2 > 0 THEN 1 ELSE 0 END ) = 0 THEN 1 ELSE SUM( CASE Value2 > 0 THEN 1 ELSE 0 END ) ) 内部的案例-部分复制了两
SUM(Value1)/(
CASE SUM(
CASE Value2 > 0
THEN 1
ELSE 0
END
) = 0
THEN 1
ELSE SUM(
CASE Value2 > 0
THEN 1
ELSE 0
END
)
)
内部的案例
-部分复制了两次,最好将别名或变量设置为该值,并使用该别名或变量。CTE answer
WITH
step1 AS
(
SELECT
SUM(value1) AS interimValue1
SUM(CASE value2 > 0 THEN 1 ELSE 0 END) AS interimValue2,
<other fields>
FROM
<a query>
)
SELECT
interimValue / CASE interimValue2 = 0 THEN 1 ELSE interimValue2 END
FROM
step1
(如果返回0,则返回NULL,允许COALESCE将NULL替换为1s。)
如果
SUM
的结果等于0
,则NULL
将产生NULL
,否则它将返回SUM
的结果COALESCE
将保留NULLIF
的结果,如果它不是NULL
,则保持不变,否则将返回1
。SQL的味道是什么?你会使用CommonTableExpressions吗?一开始没有对你的答案给予足够的关注。您上次关于返回NULL而不是0的建议实际上是一个非常好的主意!为您提供一个NULLIF
调用,我必须将其包含在解决方案中。
SELECT
interimValue / CASE interimValue2 = 0 THEN 1 ELSE interimValue2 END
FROM
(
SELECT
SUM(value1) AS interimValue1
SUM(CASE value2 > 0 THEN 1 ELSE 0 END) AS interimValue2,
<other fields>
FROM
<a query>
)
AS step1
SUM(value1) / COALESCE(SUM(CASE WHEN value2 > 0 THEN 1 ELSE NULL END), 1)
SUM(Value1) / COALESCE(NULLIF(SUM(CASE WHEN Value2 > 0 THEN 1 ELSE 0 END), 0), 1)