3

このような t-sql クエリの条件を記述できる状況によく遭遇します...

DECLARE @FirstName NVARCHAR(500)    
SET @FirstName ='Joe'

SELECT * 
FROM dbo.Customers c
WHERE 
    CASE 
        WHEN  @FirstName <> ''  THEN
            CASE WHEN c.FirstName= @FirstName THEN 1 ELSE 0 END
        ELSE 1
     END = 1 

それともこんな...

SELECT * 
FROM dbo.Customers c
WHERE 
    (@FirstName = ''  OR (@FirstName <> '' AND c.FirstName = @FirstName))

どちらも同じ結果を生成し、両方のクエリ プランは同じように見えます。

だから、どちらがベストプラクティスなのか、それとも落とし穴があるのか​​ 興味がありますか?

4

3 に答える 3

3

この場合、主に読みやすさも重要だと思いますが、最初のクエリの例ではさらに多くのことを行っています。データベースに行ごとに 0 または 1 の値を作成させ、値が 0 または 1 であるかどうかをデータベースに確認させる必要があります。私の意見では、クエリを作成するときの手順が少ないほど良いと思います。

@FirstName<> '' は不要なのでおそらく取り除くことができますが、2 番目のアプローチを選択します。そのため、クエリはもう少しクリーンアップされます。

SELECT * 
FROM dbo.Customers c
WHERE 
    (@FirstName = ''  OR c.FirstName = @FirstName)

編集: マーティン・スミスは、あなたが検討したいと思うかもしれない非常に良い洞察を提供しました.

于 2012-07-30T16:14:08.860 に答える
0

最近の SQL Server ビルドには、変数を最適化できる特定の最適化があるため、変数を null にデフォルト設定する 2 番目のバリアントを好みます。

DECLARE @FirstName NVARCHAR(500) = NULL

SELECT * 
FROM dbo.Customers c
WHERE 
    (@FirstName IS NULL OR c.FirstName = @FirstName)

詳細については、この SO の回答を参照してください: https://stackoverflow.com/a/3415629/1564603

于 2012-07-31T03:46:49.583 に答える
0

Null Mathing を避けるために LIKE を使用するのはどうですか?

DECLARE @FirstName NVARCHAR(500) = NULL

SELECT * FROM dbo.Customers c WHERE (c.FirstName LIKE @FirstName+'%')

検索時間のコストが長くなるという事実に関係なく、結果は同じで、さらに興味深いものになる可能性があると思います

于 2016-01-20T18:10:14.513 に答える