0

次のようなクエリを作成しようとしています: アイテム データベースに列があり、これらの列は Title、AuthorName、および ItemType と呼ばれます。クエリで次のことを行いたい: ユーザーが AuthorName、Title を入力し、ドロップダウン リストから ItemType を選択します。ユーザーは AuthorName または Title ボックスを空のままにすることができます。たとえば、彼が AuthorName の部分を埋めていなくても、指定された ItemType と指定された Title を持つアイテムが見つかった場合、それを結果に表示します。同様に、タイトルは空のままにすることができます。この場合、指定された AuthorName を持つアイテムが結果リストに表示されます。これが私のクエリです:

SELECT  *
FROM    [Items]
WHERE   ( ( ( [Title] LIKE '%' + @Title + '%' )
            AND ( [ItemType] = @ItemType )
          )
          OR ( ( [AuthorName] LIKE '%' + @AuthorName + '%' )
               AND ( [ItemType] = @ItemType )
             )
        )

ただし、AuthorName または Title が空のままの場合、結果は見つかりません。誰でも助けることができますか?

ありがとう

4

4 に答える 4

2
Select ...
From Items
Where ( @Title Is Null Or Title Like '%' + @Title + '%' )
    And ( @AuthorName Is Null Or AuthorName Like '%' + @AuthorName + '%' )
    And ItemType = @ItemType

ASP.NET では、フォームの値をチェックしてstring.IsNullOrEmpty、true の場合DBNull.Valueは、空の文字列の代わりにパラメーター化されたクエリに送信する必要があります。

パラメータに空の文字列を渡すことを主張する場合 (これは推奨されません)、クエリは空の文字列をチェックする必要があります。

Select ...
From Items
Where ( Len(@Title) = 0 Or Title Like '%' + @Title + '%' )
    And ( Len(@AuthorName) = 0 Or AuthorName Like '%' + @AuthorName + '%' )
    And ItemType = @ItemType

SQL Server では、Len関数はスペースを無視します。本当に夢中になり、クエリですべてのチェックを行いたい場合 (これもお勧めしません)、パラメーターが空の文字列、すべてのスペース、または null であることを考慮する必要があります。

Select ...
From Items
Where ( Len(Coalesce(@Title,'')) = 0 Or Title Like '%' + @Title + '%' )
    And ( Len(Coalesce(@AuthorName,'')) = 0 Or AuthorName Like '%' + @AuthorName + '%' )
    And ItemType = @ItemType
于 2013-05-30T15:09:45.967 に答える
1

これについては、 code.scottshipp.comのコード ブログでチュートリアル全体を書きました。そのチュートリアルのコードの完全なダウンロードが利用可能です。ストアド プロシージャとして設定する方法を示しますが、クエリで where 句を作成する方法についても詳しく説明します。したがって、両方のインスタンスをカバーします。ただし、ストアド プロシージャ ルートを使用する方が簡単な場合があるので、一読することをお勧めします。

心に留めておくべきことは、これを行うにはさまざまな方法があるということですが、ISNULL 関数のようなものを使用すると、コードが特定の状況で機能し、他の状況では機能しないように見える「落とし穴」もあります。

代わりに、一般的に、次のことをお勧めします。

次のスニペットを、空白になることが予想される where 句の任意の部分に追加します。

    OR SomeParam IS NULL

また、全体を括弧で囲むと読みやすくなります。ある時点で空白になる可能性があると思われる各パラメーターに対してこれを行います。これは、たとえば、select ステートメントが次のようになることを意味します。

SELECT  *
FROM    [Items]
WHERE   ( ( ( [Title] LIKE '%' + @Title + '%' OR [Title] IS NULL )
        AND ( [ItemType] = @ItemType OR [ItemType] IS NULL )
      )
      OR ( ( [AuthorName] LIKE '%' + @AuthorName + '%' OR [AuthorName] IS NULL)
           AND ( [ItemType] = @ItemType OR [ItemType] IS NULL )
         )
    )
于 2013-05-30T15:20:12.733 に答える
1

これを試してください

  SELECT  *
FROM    [Items]
WHERE   ( ( ( [Title] LIKE CASE WHEN ISNULL(@Title,'')='' THEN [Title] ELSE '%' + @Title + '%' END )
            AND ( [ItemType] = @ItemType )
          )
          OR ( ( [AuthorName] LIKE CASE ISNULL(@AuthorName,'')='' THEN [AuthorName] ELSE '%' + @AuthorName + '%' END)
               AND ( [ItemType] = @ItemType )
             )
        )

これは役に立ちます。これは、タイトルまたは作成者名を渡さなくても実行されます。

于 2013-05-30T15:24:01.890 に答える