Sql WHERE子句中的isnull函数
我试图修复存储过程中的一个问题,但遇到了一个困扰我的问题 基本上,Sql WHERE子句中的isnull函数,sql,sql-server-2014,isnull,Sql,Sql Server 2014,Isnull,我试图修复存储过程中的一个问题,但遇到了一个困扰我的问题 基本上,isnull对T0中的一条记录按预期工作,但对另一条记录不起作用,其中T0.FatherCard均为NULL。我不明白为什么 SELECT * FROM OINV T0 WHERE ISNULL(T0.FatherCard, T0.CardCode) = 'C0189' 按预期返回完整的数据行 SELECT * FROM OINV T0 WHERE ISNULL(T0.FatherCard, T0.CardCode) = 'C0
isnull
对T0中的一条记录按预期工作,但对另一条记录不起作用,其中T0.FatherCard
均为NULL。我不明白为什么
SELECT *
FROM OINV T0
WHERE ISNULL(T0.FatherCard, T0.CardCode) = 'C0189'
按预期返回完整的数据行
SELECT *
FROM OINV T0
WHERE ISNULL(T0.FatherCard, T0.CardCode) = 'C0817'
不返回任何内容。我期待着一个完整的数据行
在这两种情况下,FatherCard=NULL
CardCode FatherCard Table
------------------------------
C0189 NULL OINV
C0817 NULL OINV
FatherCard
和CardCode
的类型和长度都相同(nvarchar
)
如果我删除了ISNULL
函数,只需选择WHERE T0.CardCode=C0817
,它就可以正常工作
SELECT *
FROM OINV T0
WHERE ISNULL(T0.FatherCard, T0.CardCode) = 'C0817'
是否可能T0。父亲卡在ISNULL
评估中实际上不是空的,并且正在返回一些其他值 请使用
where columnname is null
请使用
where columnname is null
有两种可能性
父卡的字符串值可能为“NULL”,而实际上并非beNULL
在C0817的末尾可能有多余的空格,即'C0817'
要检查使用:
SELECT '[' + CardCode + ']', ISNULL(FatherCard, 'Yes is NULL')
FROM OINV
WHERE RTRIM(CardCode) = 'C0817'
有两种可能性
父卡的字符串值可能为“NULL”,而实际上并非beNULL
在C0817的末尾可能有多余的空格,即'C0817'
要检查使用:
SELECT '[' + CardCode + ']', ISNULL(FatherCard, 'Yes is NULL')
FROM OINV
WHERE RTRIM(CardCode) = 'C0817'
它是NULL值还是NULL文本字符串“NULL”?请从OINV T0运行SELECT*,isnull(T0.FatherCard,T0.CardCode)并发布您需要的内容get@shree.pat18-它是空值。@NiyokoYuliawan-我可以这样做,但结果表很大。您是否在寻找每条记录中的完整行以进行比较?@shree.pat18实际上您似乎是对的,一行中的值为NULL,另一行中的值为string NULL。值之间的差异我不确定,这是仅通过SAP客户端更新的SAP数据库。它是空值还是文本字符串“NULL”中的空值?请运行SELECT*,isnull(T0.FatherCard,T0.CardCode)从OINV T0
发布您想要的内容get@shree.pat18-它是空值。@NiyokoYuliawan-我可以这样做,但结果表很大。您是否在寻找每条记录中的完整行以进行比较?@shree.pat18实际上您似乎是对的,一行中的值为NULL,另一行中的值为string NULL。值之间的差异我不确定,这是只通过SAP客户端更新的SAP数据库。我可以使用if
语句检查第一列是否为空,如果为空,则使用第二列,但我认为这就是isnull()
应该做什么?我可以使用if
语句检查第一列是否为空,然后使用第二列检查是否为空,但我认为isnull()
应该做什么?谢谢Craig。我应该检查一下,但是你是对的,值实际上不是NULL
whereT0.CardCode=C0817
,而是T0.CardCode=C0189
。我不知道是什么或者为什么,这是一个非常普通的SAP B1数据库。@nickc在如何设置文本类型字段的空值方面很容易出错。1) 在update语句中意外地在NULL关键字周围加了引号。例如,更新。。。设置Col='NULL'
2)如果使用编辑器(网格/文本框)更新值,则可能会错误地键入字符串“NULL”。某些控件(例如SQL Server Management Studio中的编辑网格)需要使用特殊技术来设置NULL,例如Ctrl+0
。另请参阅关于使用CASE语句,我建议最好在每次需要处理边缘情况时清理数据,而不是编写晦涩难懂的SQL。注意,您可能还需要考虑一个空字符串是否实际上是一个有效的值。我怀疑在这种情况下不是这样,所以这些也应该更新为NULL。这可以通过更新OINV SET FatherCard=NULL轻松完成,其中FatherCard位于('NULL','')
。为了避免将来数据的恶化,您应该确保所有输入源都能正确设置NULL(甚至可能创建检查约束以防止某些已知的无效值)。谢谢Craig。我应该检查一下,但是你是对的,值实际上不是NULL
whereT0.CardCode=C0817
,而是T0.CardCode=C0189
。我不知道是什么或者为什么,这是一个非常普通的SAP B1数据库。@nickc在如何设置文本类型字段的空值方面很容易出错。1) 在update语句中意外地在NULL关键字周围加了引号。例如,更新。。。设置Col='NULL'
2)如果使用编辑器(网格/文本框)更新值,则可能会错误地键入字符串“NULL”。某些控件(例如SQL Server Management Studio中的编辑网格)需要使用特殊技术来设置NULL,例如Ctrl+0
。另请参阅关于使用CASE语句,我建议最好在每次需要处理边缘情况时清理数据,而不是编写晦涩难懂的SQL。注意,您可能还需要考虑一个空字符串是否实际上是一个有效的值。我怀疑在这种情况下不是这样,所以这些也应该更新为NULL。这可以通过更新OINV SET FatherCard=NULL轻松完成,其中FatherCard位于('NULL','')
。为了避免将来数据的恶化,您应该确保所有输入源都能正确设置NULL(甚至可能创建检查约束以防止某些已知的无效值)。