SQL Case语句返回错误的值

时间:2015-04-14 17:52:05

标签: sql sql-server null case

我有以下sql语句,如果t2.InventoryStatusCode更改为'p',则该字段旨在为字段t1.DWPostedDateKey赋值。 t1.DWPostedDateKey的起始值为NULL,如果t2.InventoryStatusCode没有改变,我希望它保持为NULL。

select
t1.DateKey,
t1.DWPostedDateKey,
(CASE WHEN t2.InventoryStatusCode = 'p' 
             and (t1.InventoryStatusKey != t2.InventoryStatusKey) THEN 
     CONVERT(int, GetDate(), 112)
ELSE 
     t1.DWPostedDateKey
END)
from table1 t1 inner join
   table2 t2 on t1.key = t2.key

问题是我没有得到NULL?以下是结果示例:

DateKey     DWPostedDateKey   (No column name)
20150413    NULL              42106
20150413    NULL              42106
20150413    NULL              42106
20150413    20150414          20150414
20150413    20150414          20150414
20150413    20150414          20150414

42106在那里做什么?我希望它保持NULL值。

2 个答案:

答案 0 :(得分:1)

问题是此行CONVERT(int, GetDate(), 112),特别是int

当您执行该操作时,它会将datetime转换为int和SQL Server,并返回自19/1年1月1日以来的天数。 (这是你看到的数字)

这将返回您需要的内容 CONVERT(varchar, GetDate(), 112)

如果你需要一个整数尝试这个
CAST(CONVERT(varchar, GetDate(), 112) AS INTEGER)

希望这有帮助

答案 1 :(得分:0)

只要我可以测试它,您的SQL代码就能正常工作。您的数据似乎是您获取的是int值而不是NULL值。

如果您将表t1和t2中的行作为此结果集的基础发布,将会有所帮助。

但是,当我重现它时,我只能在更改' InventoryStatus'的值时在第三列中生成一个int。在t2。

declare @table1 table (
    [key] int,
    DateKey nvarchar(8),
    DWPostedDateKey nvarchar(8),
    InventoryStatusKey int
)

declare @table2 table (
    [key] int,
    InventoryStatusKey int,
    InventoryStatusCode nvarchar(1)
)

insert into @table1 values (1, N'20150413', NULL, 1)
insert into @table1 values (2, N'20150413', NULL, 1)
insert into @table1 values (3, N'20150413', NULL, 1)
insert into @table1 values (4, N'20150413', N'20150414', 1)
insert into @table1 values (6, N'20150413', N'20150414', 1)

insert into @table2 values (1, 1, 'a')
insert into @table2 values (1, 2, 'a')
insert into @table2 values (3, 2, 'p') 
insert into @table2 values (4, 2, 'a')
insert into @table2 values (6, 1, 'a')

select
    t1.DateKey,
    t1.DWPostedDateKey,
    (CASE WHEN 
        t2.InventoryStatusCode = 'p' 
        and (t1.InventoryStatusKey != t2.InventoryStatusKey) 
     THEN 
        CONVERT(int, GetDate(), 112)
ELSE 
     t1.DWPostedDateKey
END)
from @table1 t1 inner join
   @table2 t2 on t1.[key] = t2.[key]

我从' a'更改了InventoryStatusCode的值。到了' p'结果就是你得到的东西。