在有人说这个表应该规范化,最佳实践等之前。我将承认这是我们在SQL Server 2008 R2中的旧表,我无法做任何改变它。话虽如此,这个表有以下几列:
"PreparedBy", "PrelimApprovalBy", "Approval1Signer", "Approval2Signer"
所有这些字段都有用户名或NULL或''。我想获得相同用户名出现在上述2个或更多字段中的所有行。如果2个字段为NULL,则 NOT 匹配,如果它们都是'',则 NOT 匹配。所以NULL和''都需要被排除,因为它们不代表任何东西。
在这里我想到了什么,但我不喜欢它:
我正在考虑检查WHERE子句中的所有排列(检查NULL和''),通过执行
WHERE PreparedBy = PrelimApprovalBy OR PreparedBy = Approval1Signer OR ...
必须有更好的方法来做到这一点。
答案 0 :(得分: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)。
答案 1 :(得分: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))
我无法想到实现你所寻求的任何简单方法。