Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql Where语句不正确_Sql_Sql Server 2008 - Fatal编程技术网

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表示相同的意思(它们很少这样做),那么其中一个是不允许的。