检查列IS NULL在案例表达式中不起作用

时间:2019-10-22 19:17:17

标签: sql sql-server sql-update case sql-view

enter image description here

我正在尝试检查属于View“ IS NULL”的列,并且它与select语句配合使用是很好的:

SELECT TOP (1000) [Invoice_Number]
  ,[Invoice_Date]
  ,[Invoice_Amount]
  ,[Invoice_CoCd]
  ,[Invoice_vendor]
  ,[Invoice_PBK]
  ,[Invoice_DType]
  ,[Invoice_DueDate]
  ,[Invoice_ClgDate] FROM [dbo].[viewABC] where   Invoice_PBK IS NULL

现在我有一条update语句,我需要在其中基于VIEW中的NULL更新表中的列:

UPDATE cis
    SET
    cis.InvoiceStatus = 
    (
    CASE 

    WHEN RTRIM(LTRIM(imd.[Invoice_PBK])) IS NULL THEN 
    'HELLO'  
    WHEN RTRIM(LTRIM(imd.Invoice_DType)) = 'RD' 
    THEN        '233'  END)
FROM 
    [dbo.[tblABC] cis,
    [dbo].[viewABC] imd 
WHERE [condition logic]

这些与位置条件无关,IS NULL表达式中的CASE引起了问题。

有人可以帮忙吗?

2 个答案:

答案 0 :(得分:0)

看这个表达式:

cis.InvoiceStatus =
CASE 
    WHEN RTRIM(LTRIM(imd.[Invoice_PBK])) IS NULL THEN 
        'HELLO'  
    WHEN RTRIM(LTRIM(imd.Invoice_DType)) = 'RD' THEN
        '233'  
END

这个症状:

  

CIS.InvoiceStatus被更新为NULL

显而易见的结论是都不满足WHEN的条件,因此CASE表达式的结果为NULL

也许您想要这样,它将在这种情况下保留原始值:

cis.InvoiceStatus =
CASE 
    WHEN RTRIM(LTRIM(imd.[Invoice_PBK])) IS NULL THEN 
        'HELLO'  
    WHEN RTRIM(LTRIM(imd.Invoice_DType)) = 'RD' THEN
        '233'  
    ELSE
        cis.InvoiceStatus
END

或者也许您希望这样做,以匹配空字符串值:

cis.InvoiceStatus =
CASE 
    WHEN NULLIF(RTRIM(LTRIM(imd.[Invoice_PBK])),'') IS NULL THEN 
        'HELLO'  
    WHEN RTRIM(LTRIM(imd.Invoice_DType)) = 'RD' THEN
        '233'  
END

也有必要指出两个WHEN条件正在研究两个不同的列。

最后,这里值得进行数据清理项目。需要执行LTRIM()将打破在这些字段上使用索引的任何机会(RTRIM()的情况稍差一些),并且索引使用会降低数据库性能的核心。

答案 1 :(得分:0)

您可能只想逐个测试逻辑。 试试

SELECT ISNULL(RTRIM(LTRIM(imd.[Invoice_PBK])),'Hey Im Null')
FROM 
    [dbo].[tblABC] cis,
    [dbo].[viewABC] imd 
WHERE [condition logic]

查看是否从查询返回的列上获得了String值。然后,从那里开始。它可能很简单,就像 JOIN 。我不喜欢那种旧语法,但是除了[conditions]之外,没有其他关于此表的信息。很难只为您猜一个答案。您没有详细的证据可以帮助我们。可能是您的条件,但是,您说的是“条件逻辑”,这对该线程上的组​​没有任何作用。