Sql Where语句不正确
为什么下面的语句不返回任何结果?如果我把Sql Where语句不正确,sql,sql-server-2008,Sql,Sql Server 2008,为什么下面的语句不返回任何结果?如果我把的where去掉,我会得到所有的记录,并且可以清楚地看到VarcharField在很多情况下都不匹配,而我正试图找到这些情况。我尝试在where中交换ACC和CON,并使用而不是= SELECT Con.VarcharField, ACC.VarcharField FROM dbo.Contact AS CON INNER JOIN Account as ACC ON ACC.AccountId = CON.ContactID WHERE ACC.
的where
去掉,我会得到所有的记录,并且可以清楚地看到VarcharField
在很多情况下都不匹配,而我正试图找到这些情况。我尝试在where中交换ACC和CON,并使用
而不是=代码>
SELECT Con.VarcharField, ACC.VarcharField
FROM
dbo.Contact AS CON
INNER JOIN Account as ACC ON ACC.AccountId = CON.ContactID
WHERE ACC.VarcharField != CON.VarcharField
更新
问题在于表中的空值。有没有办法避免空比较?您可以检查任何一方是否为空
,另一方是否为空
SELECT Con.VarcharField, ACC.VarcharField
FROM
dbo.Contact AS CON
INNER JOIN Account as ACC ON ACC.AccountId = CON.ContactID
WHERE (ACC.VarcharField IS NULL AND CON.VarcharField IS NOT NULL)
OR (ACC.VarcharField IS NOT NULL AND CON.VarcharField IS NULL)
OR ACC.VarcharField != CON.VarcharField
要与可能为NULL的字符串字段进行比较,我更喜欢IsNull()函数。仔细的这取决于您对“无价值”的定义,以及它们是否应该匹配
WHERE IsNULL(ACC.VarcharField, '') != IsNull(CON.VarcharField, '')
你检查过数据类型吗?有一些样本数据吗?我们看不到你的数据。您必须提供表结构(它们是表还是视图,它们是相同的数据类型、相同的排序规则等?)和至少一个您认为应该与WHERE子句匹配但不匹配的示例行(包括尾随空格)。我们很好,但我们没有那么好。在这种情况下,您会发现差异吗?在这种情况下,这些列中的一列可能是
NULL
?这可以解释为什么您没有得到结果,因为您无法与NULL
进行比较,您只能检查是否为NULL
@windowskm What?、how?、What???。您已经有了很多方法来解决这些答案的比较问题。如果列可以包含空字符串,则这不一定有效。如果空字符串和NULL表示相同的内容,则效果很好。如果没有,则需要为NULL找到另一个中性值。在这些情况下,我有时会使用“NULL”或“**”。只要它是一个在上下文中没有意义的值。如果空字符串和NULL表示相同的意思(它们很少这样做),那么其中一个是不允许的。