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

ここに1つあります:

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 に答える