对于上帝的爱,有人可以解释一下这里发生了什么。 我正在研究一些存储过程错误修复,经过大量的努力,我能够找到这个奇怪的错误发生的地方,所以我为了演示而做了一个简单的例子。
案例1
DECLARE @test VARCHAR(45) ='0001'
SELECT CASE 0
WHEN -1 THEN ''
WHEN 0 THEN @test
WHEN 1 THEN 12345
END AS 'output'
案例2
DECLARE @test VARCHAR(45) ='0001'
SELECT CASE 0
WHEN -1 THEN ''
WHEN 0 THEN @test
END AS 'output'
案例1:输出为1
案例2:输出为预期的0001
零怎么了?
奇怪的是它只删除了数字之前的零(无论最后是什么数字),例如DECLARE @test VARCHAR(45) ='1000'
工作正常,就目前情况而言,很明显情况为零,如果我删除WHEN 0 THEN @test
输出为预期的null。
完成了一些研究,仅发现this。 我正在使用SQL SERVER RC1 2017以及SQL SMS。
感谢您的时间。
答案 0 :(得分:5)
这里的区别在于您的THEN
/ ELSE
表达式中包含多种数据类型。在您的" CASE 1"您有int
和varchar
数据类型。
int
的{{3}}高于varchar
,因此值会以int
的形式返回。
使用相同的数据类型,这可以按照您的要求运行:
DECLARE @test VARCHAR(45) ='0001';
SELECT CASE 0 WHEN -1 THEN ''
WHEN 0 THEN @test
WHEN 1 THEN '12345' --Note that the value in contained in single quotes
END AS [output];
答案 1 :(得分:3)
这是因为数据类型优先。
CASE
表达式documentation说明了返回的数据类型:
从中输入类型集中的最高优先级类型 result_expressions和可选的else_result_expression
意味着它在结果表达式中看起来每个类型集。由于您的返回数据为INT
,因此整个CASE
表达式的结果为INT
(因为它的优先级高于VARCHAR
)
答案 2 :(得分:1)
这种情况正在发生,因为在上一个case语句中返回的值的类型是数字,因此请尝试将其更改为
DECLARE @test VARCHAR(45) ='0001'
SELECT CASE 0
WHEN -1 THEN ''
WHEN 0 THEN @test
WHEN 1 THEN '12345'
END AS 'output'