SQL Server 2019 中的 'Data' 和 'value' 关键字是什么,它们是如何工作的?

What are the 'Data' and 'value' keywords in SQL Server 2019, and how do they work?

我正在使用 SQL Server 2019(独立服务器,非 Azure),我正在洗个澡。以下是批次:

WITH Data (value) AS
(   
SELECT 0   
UNION  ALL
SELECT 1   
)   
SELECT   
   CASE   
      WHEN MIN(value) <= 0 THEN 0   
      WHEN MAX(1/value) >= 100 THEN 1   
   END   
FROM Data ;

我做了很多研究,但无法理解 SQL 服务器中的 Datavalue 关键字是什么,以及这批处理究竟是如何工作的。 有人可以帮我吗?

当我 运行 批处理时,出现以下预期错误:

Divide by zero error encountered

为避免被零除错误使用非零值作为除数。如果除数为零,则通过根据业务添加任何数字将其转换为非零。

MAX(1/ CASE WHEN value = 0 THEN 1 ELSE value END)

还有完整代码

WITH Data (value) AS
(   
SELECT 0   
UNION  ALL
SELECT 1   
)   
SELECT   
   CASE   
      WHEN MIN(value) <= 0 THEN 0   
      WHEN MAX(1/CASE WHEN value = 0 THEN 1 ELSE value END) >= 100 THEN 1   
   END   
FROM Data ;

Datavalue 不是“魔术”关键字。如果你尝试:

WITH Data (value) AS
(   
SELECT 0   
UNION  ALL
SELECT 1   
)   
SELECT       
   value
FROM Data ;

这 returns 两行的值为 01。 'Data'这里是一个CTE(常用的table表达式),value是输出参数。您提到的 link 只是使用 CTE 来说明聚合 MAX(1/value) 将在 CASE 之前进行评估,因此总是会失败。

同样失败:

WITH MyCTE (param) AS
(   
SELECT 0   
UNION  ALL
SELECT 1   
)   
SELECT   
   CASE   
      WHEN MIN(param) <= 0 THEN 0   
      WHEN MAX(1/param) >= 100 THEN 1   
   END   
   
FROM MyCTE ;

关于除以零,防止此类错误的一种简便简洁的方法是使用 nullif

WITH Data (value) AS
(   
SELECT 0   
UNION  ALL
SELECT 1   
)   
SELECT   
   CASE   
      WHEN MIN(value) <= 0 THEN 0   
      WHEN MAX(1/NullIf(value,0)) >= 100 THEN 1   
   END   
FROM Data;