Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/85.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 将列与Null进行比较_Sql_Sql Server_Tsql - Fatal编程技术网

Sql 将列与Null进行比较

Sql 将列与Null进行比较,sql,sql-server,tsql,Sql,Sql Server,Tsql,我有以下代码 SELECT PhysicalAddressID FROM tblPhysicalAddresses as a WHERE EXISTS ( SELECT PhysicalAddressID FROM tblPhysicalAddresses as b WHERE a.PhysicalAddressID <> b.PhysicalAddressID AND

我有以下代码

SELECT 
    PhysicalAddressID
FROM 
    tblPhysicalAddresses  as a
WHERE EXISTS 
(
    SELECT 
        PhysicalAddressID
    FROM 
        tblPhysicalAddresses as b
    WHERE
        a.PhysicalAddressID <> b.PhysicalAddressID AND

        a.Address1 = b.Address1 AND
        a.Address2 = b.Address2 AND
        a.Address3 = b.Address3 AND
        a.City = b.City AND
        a.CountryID = b.CountryID AND
        a.PersonID = b.PersonID AND
        a.PhysicalAddressTypeID = b.PhysicalAddressTypeID AND
        a.PostalCode = b.PostalCode AnD
        a.Province = b.Province AND
        a.StateID = b.StateID AND
        a.ZipCode = b.ZipCode

)
我可以直观地查看数据,并看到有匹配项。但是,当我运行查询时,它不会返回任何内容。这可能是因为比较了可为空的列吗?如果是的话,还有什么选择。目标是找到重复的行

例如,一个实例,其中有个列为null。未找到匹配项,尽管它们都为空

基本上,我有80个具有相同模式的数据库。我决定把它们合二为一。但是,有重复的地址。因此,我的目标是合并重复的地址。

您可以使用将两个对应的空值计算为相等

WHERE
    a.PhysicalAddressID <> b.PhysicalAddressID
          AND EXISTS (SELECT a.Address1, a.Address2 
                      INTERSECT
                      SELECT b.Address1, b.Address2)
剩下的供您填写的列

您可以用来计算两个对应的空值是否相等

WHERE
    a.PhysicalAddressID <> b.PhysicalAddressID
          AND EXISTS (SELECT a.Address1, a.Address2 
                      INTERSECT
                      SELECT b.Address1, b.Address2)

剩下的几列留给您填写

我建议您将其作为一个汇总:

SELECT a.Address1, a.Address2, a.Address3, a.City, a.CountryID, a.PersonID,
       a.PhysicalAddressTypeID, a.PostalCode, a.Province, a.StateID, a.ZipCode,
       COUNT(*) as NumPhysicalAddresses,
       MIN(a.PhysicalAddressId), MAX(a.PhysicalAddressId)
FROM tblPhysicalAddresses a
GROUP BY a.Address1, a.Address2, a.Address3, a.City, a.CountryID, a.PersonID,
         a.PhysicalAddressTypeID, a.PostalCode, a.Province, a.StateID, a.ZipCode
HAVING COUNT(*) > 1;
如果找不到匹配项,您可能会面临许多问题:

一个或多个列为空,group by version将捕获这些列。 字符串中的空格和/或其他不可见字符。 类似的字符,如大写字母O和数字0。 尽管许多字段可能重叠,但缺少精确的副本。
我建议将其作为一个聚合:

SELECT a.Address1, a.Address2, a.Address3, a.City, a.CountryID, a.PersonID,
       a.PhysicalAddressTypeID, a.PostalCode, a.Province, a.StateID, a.ZipCode,
       COUNT(*) as NumPhysicalAddresses,
       MIN(a.PhysicalAddressId), MAX(a.PhysicalAddressId)
FROM tblPhysicalAddresses a
GROUP BY a.Address1, a.Address2, a.Address3, a.City, a.CountryID, a.PersonID,
         a.PhysicalAddressTypeID, a.PostalCode, a.Province, a.StateID, a.ZipCode
HAVING COUNT(*) > 1;
如果找不到匹配项,您可能会面临许多问题:

一个或多个列为空,group by version将捕获这些列。 字符串中的空格和/或其他不可见字符。 类似的字符,如大写字母O和数字0。 尽管许多字段可能重叠,但缺少精确的副本。
不清楚你想要什么但可能就是这个

SELECT a.PhysicalAddressID 
  FROM tblPhysicalAddresses as b
  JOIN tblPhysicalAddresses as b
    ON a.PhysicalAddressID <> b.PhysicalAddressID 
   AND (a.Address1 = b.Address1 or (a.Address1 is null and b.Address1 is null))
   AND (a.Address2 = b.Address2 or (a.Address2 is null and a.Address2 is null)) 
   AND (a.Address3 = b.Address3 or (a.Address2 is null and b.Address3 is null)) 
   AND  ...

不清楚你想要什么但可能就是这个

SELECT a.PhysicalAddressID 
  FROM tblPhysicalAddresses as b
  JOIN tblPhysicalAddresses as b
    ON a.PhysicalAddressID <> b.PhysicalAddressID 
   AND (a.Address1 = b.Address1 or (a.Address1 is null and b.Address1 is null))
   AND (a.Address2 = b.Address2 or (a.Address2 is null and a.Address2 is null)) 
   AND (a.Address3 = b.Address3 or (a.Address2 is null and b.Address3 is null)) 
   AND  ...

我们怎么知道呢?你能举一个例子,说明根据你的情况应该匹配几行吗?我不认为存在可为空的列会导致所有结果失败。但是你确定你认为应该匹配的行吗,确实匹配吗?您需要增强谓词逻辑…类似于a.Address1=b.Address1或a.Address1为空,b.Address1为空,a.Address2=b.Address2或a.Address2为空,b.Address2为空,并且…我正在谈论您问题的这一部分:我可以直观地查看数据,并看到存在匹配。我们看不到这些数据,你能发布几行这样我们就可以看到它们为什么没有被返回吗?我们怎么知道呢?你能发布一个根据你的情况应该匹配的几行的例子吗?我不认为可空列的存在会导致所有结果失败。但是你确定你认为应该匹配的行吗,确实匹配吗?您需要增强谓词逻辑…类似于a.Address1=b.Address1或a.Address1为空,b.Address1为空,a.Address2=b.Address2或a.Address2为空,b.Address2为空,并且…我正在谈论您问题的这一部分:我可以直观地查看数据,并看到存在匹配。我们看不到这些数据,您能发布几行数据吗?这样我们就可以看到为什么不返回这些数据了?这解决了问题的根源。这是一个好主意,但PhysicalAddressID不是聚合的一部分,因此不是accessible@LoganMurphy . . . 谢谢你指出这一点。修复了我的错误。这解决了问题的根源。这是一个好主意,但PhysicalAddressID不是聚合的一部分,因此不是accessible@LoganMurphy . . . 谢谢你指出这一点。我的坏毛病解决了。