SQL“select case”给出了意想不到的输出

时间:2018-01-24 14:49:01

标签: sql sql-server

对于上帝的爱,有人可以解释一下这里发生了什么。 我正在研究一些存储过程错误修复,经过大量的努力,我能够找到这个奇怪的错误发生的地方,所以我为了演示而做了一个简单的例子。

案例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。

感谢您的时间。

3 个答案:

答案 0 :(得分:5)

这里的区别在于您的THEN / ELSE表达式中包含多种数据类型。在您的" CASE 1"您有intvarchar数据类型。

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'