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 服务器中的 Data
和 value
关键字是什么,以及这批处理究竟是如何工作的。
有人可以帮我吗?
当我 运行 批处理时,出现以下预期错误:
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 ;
Data
和 value
不是“魔术”关键字。如果你尝试:
WITH Data (value) AS
(
SELECT 0
UNION ALL
SELECT 1
)
SELECT
value
FROM Data ;
这 returns 两行的值为 0
和 1
。 '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;
我正在使用 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 服务器中的 Data
和 value
关键字是什么,以及这批处理究竟是如何工作的。
有人可以帮我吗?
当我 运行 批处理时,出现以下预期错误:
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 ;
Data
和 value
不是“魔术”关键字。如果你尝试:
WITH Data (value) AS
(
SELECT 0
UNION ALL
SELECT 1
)
SELECT
value
FROM Data ;
这 returns 两行的值为 0
和 1
。 '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;