在同一行的不同列中查找重复值

Den*_*nis 7 sql t-sql sql-server

在有人咆哮之前,应该对此表进行规范化,最佳实践等.我将承认这是我们在SQL Server 2008 R2中的旧表,我无法对其进行更改.话虽如此,这个表有以下几列:

"PreparedBy", "PrelimApprovalBy", "Approval1Signer", "Approval2Signer" 
Run Code Online (Sandbox Code Playgroud)

所有这些字段都有用户名或NULL或''.我想获得相同用户名出现在上述2个或更多字段中的所有行.如果2场是NULL他们是不是一场比赛,他们是匹配的,如果他们都'.所以NULL和''都需要被排除,因为它们不代表任何东西.


这里我想的是什么,但
不喜欢它:我正在考虑检查WHERE子句中的所有排列(检查NULL和'')做一些事情的行

WHERE PreparedBy =  PrelimApprovalBy OR PreparedBy = Approval1Signer OR ...
Run Code Online (Sandbox Code Playgroud)

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

Gil*_*ilM 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
     )
Run Code Online (Sandbox Code Playgroud)

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