Sql server 转换case语句中的varchar值时,转换失败
我无法控制它。我们有以下简单的查询Sql server 转换case语句中的varchar值时,转换失败,sql-server,case,Sql Server,Case,我无法控制它。我们有以下简单的查询 DECLARE @bFlag bit SET @bFlag = 0 SELECT something = CASE WHEN @bFlag = 1 THEN CASE WHEN RS.intInterval = 1 THEN '"Days"' WHEN RS.intInterval = 2 T
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)
因此,如果flag
未设置为true
,我想获得intInterval
(即int
)。否则,如果标志
设置为真
,则我希望根据intInterval
的值获得天
、周
,等等。如果我使用@bFalg=1
运行此操作,则会出现以下错误:
将varchar值“Weeks”转换为数据时,转换失败
int型
这没有任何意义,因为我没有转换任何东西
我知道我可以通过将
cast(intInterval作为varchar)
放入else
部分来修复它。但是,我想知道为什么会出现此错误,为什么case
试图将“Weeks”转换为int
?使用case
语句时,所有结果表达式必须具有相同的数据类型。否则,结果将转换为具有更高优先级的数据类型。根据:
从中的类型集中返回优先级最高的类型
结果\u表达式和可选的else\u结果\u表达式
由于INT
的值高于VARCHAR
,将“周”
转换为INT
,从而产生错误:
将varchar值“Weeks”转换为数据时,转换失败
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)
谢谢,我一直在寻找这个位“返回result_表达式和可选的else_result_表达式中类型集的最高优先级类型。”这对于追踪来说尤其烦人,因为错误标记了case语句中没有发生转换的分支-问题不明显是
case
的另一个分支。