1

複数の変数を渡し、複数のフィールドを比較する単一のテーブルに対して検索クエリを実行しています。このような:

          WHERE  a.callerfname LIKE @FName
                 AND a.callerlname LIKE @LName
                 AND a.callermname LIKE @MName

フィールドの1つに値が選択されていない場合、フォームは%を送信します。したがって、そのフィールドはすべての結果と一致します。

1つのフィールドはProjectID、GUIDであり、値を含めることができるフィールドnullです。プロジェクトが選択されていない状態で検索を取得すると、フォームは空白のGUID(000000-000 ...)を渡し、次のCASEようにチェックします。

AND a.projectid = CASE WHEN  @ProjectId <> '00000000-0000-0000-0000-000000000000'
                       THEN  @ProjectId
                       ELSE a.projectid
                             END

問題は、行にが含まれている場合、NULL ProjectIDそれ自体と一致しないことです。私の質問は、GUIDフィールドのnull値は何に一致するのでしょうか?または、%と比較した場合の方法と名前がnullの場合、projectidにすべての値を返すようにするにはどうすればよいですか?

4

2 に答える 2

0

SQLでは、NULLはどの値とも等しくなく、NULLはNULLと等しくありません。「ISNULL」をテストする必要があります。または、テストの両側にisnull(列、デフォルト値)を適用できます。これらのいずれかが機能するはずです。私はGUIDをあまり使用しないので、データ型を一致させる必要があり、それが有効なGUID値であると想定しているため、空のGUID値をisNull条件に固定しています。

  AND ISNULL(a.projectid, '00000000-0000-0000-0000-000000000000') = CASE WHEN @ProjectId <> '00000000-0000-0000-0000-000000000000' THEN @ProjectId ELSE isnull(a.projectid, '00000000-0000-0000-0000-000000000000') END

または

AND (a.projectid = CASE WHEN @ProjectId <> '00000000-0000-0000-0000-000000000000' THEN @ProjectId ELSE a.projectid END) OR (a.projectid is null)
于 2012-04-16T18:03:40.720 に答える
0

これはプロジェクトフィルターである必要があります。パラメータが空のGUIDの場合、すべてのプロジェクトが一致します。そうでない場合は、1つだけ(またはまったく)一致しません。

WHERE (@ProjectId = '00000000-0000-0000-0000-000000000000'
       OR a.projectid = @ProjectId)
于 2012-04-16T18:14:45.647 に答える