gpt4 book ai didi

sql-server - 在 case 语句中转换 varchar 值时转换失败

转载 作者:行者123 更新时间:2023-12-03 18:33:07 24 4
gpt4 key购买 nike

我无法理解它。我们有以下简单的查询。

DECLARE @bFlag bit
SET @bFlag = 0
SELECT something = CASE
WHEN @bFlag = 1 THEN
CASE
WHEN RS.intInterval = 1 THEN '"Days"'
WHEN RS.intInterval = 2 THEN '"Weeks"'
WHEN RS.intInterval = 3 THEN '"Months"'
WHEN RS.intInterval = 4 THEN '"Years"'
END
Else
RS.intInterval
End
from MyTable AS RS WITH (NOLOCK)

因此,如果 intInterval 未设置为 int ,我想获得 flag (即 true )。否则,如果 flag 设置为 true ,我想根据 Days 的值获取 WeeksintInterval 等。如果我用 @bFalg = 1 运行它,我会收到这个错误:

Conversion failed when converting the varchar value '"Weeks"' to data type int



这没有任何意义,因为我没有转换任何东西。

我知道我可以通过将 cast (intInterval as varchar) 放在 else 部分来修复它。但是我想知道我收到这个错误的原因,为什么 case 试图将 'Weeks' 转换为 int

最佳答案

使用 CASE 语句时,所有结果表达式必须具有相同的数据类型。如果不是,则结果将转换为具有更高优先级的数据类型。根据 BOL :

Returns the highest precedence type from the set of types in result_expressions and the optional else_result_expression.



由于 INT 具有比 VARCHAR 更高的 data type precedence"Weeks" 被转换为 INT 并产生错误:

Conversion failed when converting the varchar value '"Weeks"' to data type int



另一个会产生相同错误的示例:
SELECT CASE WHEN 1 = 1 THEN 'True' ELSE 0 END

解决方案是将 RS.intInterval 转换为 VARCHAR :
CONVERT(VARCHAR(10), RS.intInterval)

您的最终查询应该是:
DECLARE @bFlag bit
SET @bFlag = 0
SELECT something = CASE
WHEN @bFlag = 1 THEN
CASE
WHEN RS.intInterval = 1 THEN '"Days"'
WHEN RS.intInterval = 2 THEN '"Weeks"'
WHEN RS.intInterval = 3 THEN '"Months"'
WHEN RS.intInterval = 4 THEN '"Years"'
END
Else
CONVERT(VARCHAR(10), RS.intInterval)
End
from MyTable AS RS WITH (NOLOCK)

关于sql-server - 在 case 语句中转换 varchar 值时转换失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32000634/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com