【问题标题】:Check column IS NULL not working in Case Expression检查列 IS NULL 在案例表达式中不起作用
【发布时间】:2020-02-18 23:56:47
【问题描述】:

我正在尝试检查属于 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

现在我有一个更新语句,我需要根据 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]

这些与 where 条件无关,CASE 表达式中的 IS NULL 会导致问题。

有人可以帮忙吗?

【问题讨论】:

  • 您的CASE 表达式 中似乎缺少END。 T-SQL 中没有Case 语句。
  • 不更新了吗?您是否尝试先将更新语句作为选择语句运行?
  • @Larnu:我已经更正了
  • 你有什么错误?
  • @TinyHaitian :我正在从 c# 控制台应用程序调用此更新语句(在存储过程中)

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


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

    看这个表达式:

    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() 稍微不那么糟糕),并且索引使用会降低数据库性能的核心。

    【讨论】:

    • CIS.InvoiceStatus 更新为 NULL,而应该更新为“HELLO”
    • 仅供参考,如果我尝试与 Invoice_DType 匹配,我没有任何问题。当我尝试使用 Invoice_PBK IS NULL 时会出现问题
    • 我的原始值将是 ' ',目前我尝试使用 'HELLO' 进行更新。它不工作并更新为 NULL
    • 空字符串和 NULL 不是是一回事。如果您进行IS NULL 检查,则结果为false 为空字符串。
    猜你喜欢
    • 1970-01-01
    • 2021-02-21
    • 1970-01-01
    • 1970-01-01
    • 2013-02-04
    • 2013-03-02
    • 1970-01-01
    • 1970-01-01
    • 2018-04-22
    相关资源
    最近更新 更多