0

WHERESQL Serverの条件句のソリューションが必要です。WHERE宣言された変数に応じて、関数を句に追加する方法がわかりません。条件部分を必要なロジックで囲みます

DECLARE @distance bigint
DECLARE @photosneeded bigint

SET @distance * 50

SELECT * FROM users u
WHERE
  [IF @distance > 0 THEN distance_function(lat1,lon1,lat2,lon2)<=@distance END]
  AND
  [IF @photosneeded>0 THEN u.photo IS NOT NULL AND u.photo <>'' END]
4

3 に答える 3

5

プレーンなWHERE句を使用して実行できます。

SELECT * FROM users u
WHERE
(@distance <= 0 or (distance_function(lat1,lon1,lat2,lon2)<=@distance))
AND
(@photosneeded <= 0 or (u.photo IS NOT NULL AND u.photo <>''))

ただし、実行プランの最適化を実際に台無しにする可能性があるため、句内のこの種の条件には注意する必要があります。理由の詳細については、@Iainの回答を参照してください。

于 2012-06-27T17:26:53.110 に答える
3

私のアドバイスは、それを3つの別々の手順にすることです。1つは最初の句を使用する完全なクエリ用、もう1つは2番目の句を使用する完全なクエリ用、3つ目は条件に応じていずれかを呼び出す「マスター」としてです。過去にSQLServerが条件節の最初に使用されたブランチのみをコンパイルするという問題がありました(2008の場合かどうかはわかりません)。したがって、個別のストアドプロシージャを使用すると、それから保護されます。これは簡単な方法です。物事を整理します。

于 2012-06-27T17:27:08.987 に答える
0
SELECT * FROM users u
WHERE
 ( @distance <= 0 or distance_function(lat1,lon1,lat2,lon2)<=@distance )
 and
 ( @photosneeded <= 0 or isnull(u.photo, '') <> '' )
于 2012-06-27T17:30:10.707 に答える