我正在尝试检查属于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
引起了问题。
有人可以帮忙吗?
答案 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]
之外,没有其他关于此表的信息。很难只为您猜一个答案。您没有详细的证据可以帮助我们。可能是您的条件,但是,您说的是“条件逻辑”,这对该线程上的组没有任何作用。