7

在有人抱怨该表应该被规范化、最佳实践等之前。我要承认这是我们在 SQL Server 2008 R2 中拥有的旧表,我对更改它无能为力。话虽如此,该表具有以下列:

"PreparedBy", "PrelimApprovalBy", "Approval1Signer", "Approval2Signer" 

所有这些字段都有用户名或 NULL 或 ''。我想获取在上面提到的 2 个或更多字段中出现相同用户名的所有行。如果 2 个字段为 NULL,则它们不是匹配项,如果它们都是 '',则它们不是匹配项。所以 NULL 和 '' 都需要被排除,因为它们没有任何意义。


这是我到目前为止的想法,但我不喜欢它:
我正在考虑通过执行以下操作来检查 WHERE 子句中的所有排列(检查 NULL 和 '')

WHERE PreparedBy =  PrelimApprovalBy OR PreparedBy = Approval1Signer OR ...

必须有更好的方法来做到这一点。

4

2 回答 2

7

这是一个:

SELECT * FROM T
WHERE EXISTS 
     (SELECT 1 
      FROM (VALUES 
                   (PreparedBy)
                  ,(PrelimApprovalBy)
                  ,(Approval1Signer)
                  ,(Approval2Signer)) AS X (n)
      WHERE NULLIF(n, '') IS NOT NULL
      GROUP BY n
      HAVING COUNT(*)>1
     )

基本上,对于每一行,我们正在构建一个包含不同行中的列值的迷你表,并执行 GROUP BY 和 HAVING 来检查匹配值组。NULLIF 帮助我们忽略 '' 值(使它们为 NULL,然后排除所有 NULL)。

于 2013-07-09T18:16:18.917 回答
2

试试这个查询:

SELECT PreparedBy, PrelimApprovalBy, Approval1Signer, Approval2Signer
WHERE 
((PreparedBy = PrelimApprovalBy AND NULLIF(PreparedBy, '') IS NOT NULL) 
OR
(PreparedBy = Approval1Signer AND NULLIF(PreparedBy, '') IS NOT NULL) 
OR
(PreparedBy = Approval2Signer AND NULLIF(PreparedBy, '') IS NOT NULL) 
OR
(PrelimApprovalBy = Approval1Signer  AND NULLIF(PrelimApprovalBy, '') IS NOT NULL) 
OR 
(PrelimApprovalBy = Approval2Signer AND NULLIF(PrelimApprovalBy, '') IS NOT NULL) 
OR
(Approval1Signer = Approval2Signer AND NULLIF(Approval1Signer, '') IS NOT NULL))

我想不出任何更简单的方法来实现您所寻求的。

于 2013-07-09T18:06:57.743 回答