5

SQL (SQL Server 2005) でVB のAndAlso/OrElseおよび C#の&&/に相当するものはありますか。||次のような選択クエリを実行しています。

SELECT a,b,c,d
FROM table1
WHERE 
(@a IS NULL OR a = @a)
AND (@b IS NULL OR b = @b)
AND (@c IS NULL OR c = @c)
AND (@d IS NULL OR d = @d)

たとえば、"@a" パラメータが NULL として渡された場合、WHERE 句の 2 番目の部分 (a = @a) を評価しても意味がありません。特別な構文を使用するか、クエリを書き直すことで、これを回避する方法はありますか?

ありがとう、ジェームズ。

4

5 に答える 5

6

評価の順序を保証する唯一の方法は、CASE を使用することです

WHERE
   CASE
      WHEN @a IS NULL THEN 1
      WHEN a = @a THEN 1
      ELSE 0
   END = 1
   AND /*repeat*/

私の経験では、これは通常、DB エンジンにそれを整理させるよりも遅くなります。

通常、TerrorAustralis の回答は、null 非許容列の最適なオプションです。

于 2010-07-18T12:44:49.207 に答える
3

これを試して:

AND a = ISNULL(@a,a)

この関数は @a を調べます。null でない場合は、式と同等です

AND a = @a

null の場合は、式と同等です

AND a = a 

(これは常に true であるため、@b is null ステートメントを置き換えます)

于 2009-10-30T13:00:31.143 に答える
2

クエリ エンジンがこれを処理します。書かれているように、クエリは問題ありません。可能であれば、すべてのオペレーターが「短絡」します。

于 2009-10-30T11:24:07.873 に答える
0

次の例を見てください。

SELECT * FROM Orders
WHERE orderId LIKE '%[0-9]%' 
AND dbo.JobIsPending(OrderId) = 1 

Orders.OrderIdは varchar(25)

dbo.JobIsPending(OrderId)int パラメータを持つ UDF

変換が失敗するため、短絡は発生しません。dbo.JobIsPending(OrderId) when Orders.OrderId NOT LIKE '%[0-9]%'

SQL Server 2008 R2 でテスト済み

于 2014-02-15T20:08:28.197 に答える
0

別の方法は次のとおりです。

IF (@a > 0) IF (@a = 5)
BEGIN

END

条件の後の別の if は、「AndAlso」ロジックを実行します。

これは簡単な書き方であることを強調したいと思います。

IF (@a > 0) 
     IF (@a = 5)
     BEGIN

     END
于 2014-02-02T15:06:49.083 に答える