Проверьте, что столбец IS NULL не работает в Case Expression - PullRequest
0 голосов
/ 22 октября 2019

enter image description here

Я пытаюсь проверить столбец, который принадлежит представлению "IS NULL", и он хорошо работает с оператором выбора:

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

Теперь у меня есть оператор обновления, в котором мне нужно обновить столбец в таблице на основе NULL в VIEW:

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, IS NULL в выражении CASEвызывая проблему.

Может кто-нибудь помочь, пожалуйста?

Ответы [ 2 ]

0 голосов
/ 22 октября 2019

Вы можете просто протестировать свою логику по частям. Попробуйте

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

Проверьте, получите ли вы значение String для возвращаемых столбцов из запроса. Затем строить оттуда. Это может быть что-то простое, например JOIN . Который я не фанат этого старого синтаксиса, но без дополнительной информации об этой таблице, кроме [conditions]. Трудно просто угадать ответ для вас. У вас нет подробных доказательств, которые нам помогают. Это могут быть ваши условия, но вы говорите «логика условий», и это ничего не делает для группы в этой теме.

0 голосов
/ 22 октября 2019

Глядя на это выражение:

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() немного менее вредно), и использование индексов снизит основную производительность базы данных.

...