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

Djo*_*olo 1 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'
Run Code Online (Sandbox Code Playgroud)

案例2

DECLARE @test VARCHAR(45) ='0001'
SELECT CASE 0
WHEN -1 THEN ''
WHEN 0 THEN @test

END AS 'output'
Run Code Online (Sandbox Code Playgroud)

案例1:输出为1

情况2:输出为0001,如预期

零怎么了?奇怪的是它只删除了数字之前的零(无论结尾处是什么数字),例如 DECLARE @test VARCHAR(45) ='1000'工作正常,就目前情况而言,很明显情况为零,如果我删除WHEN 0 THEN @test输出是否为预期的null.

做了一些研究,发现只有这个.我正在使用SQL SERVER RC1 2017以及SQL SMS.

感谢您的时间.

Lar*_*rnu 5

这里的区别在于您的THEN/ ELSE表达式中有多个数据类型.在"CASE 1"中,您同时拥有int和/和varchar数据类型.

int具有更高的数据类型的优先级(处理SQL)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];
Run Code Online (Sandbox Code Playgroud)