質問

パラメータの一部がオプションである検索結果を返すストアドプロシージャを作成しています。

「ifステートメント」が必要です;私の where 節で使用できますが、機能しません。 where 句は、null以外のパラメーターのみでフィルタリングする必要があります。

これがspです

ALTER PROCEDURE spVillaGet 
-- Add the parameters for the stored procedure here
@accomodationFK int = null,
@regionFK int = null,
@arrivalDate datetime,
@numberOfNights int,
@sleeps int = null,
@priceFloor money = null,
@priceCeil money = null
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;

-- Insert statements for procedure here
select tblVillas.*, tblWeeklyPrices.price from tblVillas
INNER JOIN tblWeeklyPrices on tblVillas.villaId = tblWeeklyPrices.villaFK
where 
    If @accomodationFK <> null then
        accomodationTypeFK = @accomodationFK 
     @regionFK <> null Then
        And regionFK = @regionFK 
    IF @sleeps <> null Then
        And sleeps = @sleeps 
    IF @priceFloor <> null Then
        And price >= @priceFloor And price <= @priceCeil


END

これを行う方法はありますか?

役に立ちましたか?

解決

select tblVillas.*, tblWeeklyPrices.price 
from tblVillas
INNER JOIN tblWeeklyPrices on tblVillas.villaId = tblWeeklyPrices.villaFK
where (@accomodationFK IS null OR accomodationTypeFK = @accomodationFK)
  AND (@regionFK IS null or regionFK = @regionFK)
  AND (@sleeps IS null OR sleeps = @sleeps)
  AND (@priceFloor IS null OR (price BETWEEN @priceFloor And @priceCeil))

他のヒント

過去に&quot; COALESCE を使用しました。節 "rel =" nofollow noreferrer ">動的WHERE節&quot;あなたが話しているように。

SELECT *
FROM  vehicles
WHERE ([vin]   LIKE COALESCE(@vin, [vin])     + '%' ESCAPE '\')
  AND ([year]  LIKE COALESCE(@year, [year])   + '%' ESCAPE '\')
  AND ([make]  LIKE COALESCE(@make, [make])   + '%' ESCAPE '\')
  AND ([model] LIKE COALESCE(@model, [model]) + '%' ESCAPE '\')

ある列のデータが特定の行の null であり、ユーザーが入力しなかった場合、null許容の列をオプションでフィルターしたいときに大きな問題が発生します。その列で検索するもの(ユーザー入力も null )の場合、その行は結果にも表示されません(フィルターがオプションであり、不適切な排他的動作です)。

null許容フィールドを補うために、次のようにSQLを探してメッシエを行う必要があります。

SELECT *
FROM  vehicles
WHERE (([vin]   LIKE COALESCE(@vin, [vin])     + '%' ESCAPE '\')
       OR (@vin IS NULL AND [vin] IS NULL))
  AND (([year]  LIKE COALESCE(@year, [year])   + '%' ESCAPE '\')
       OR (@year IS NULL AND [year] IS NULL))
  AND (([make]  LIKE COALESCE(@make, [make])   + '%' ESCAPE '\')
       OR (@make IS NULL AND [make] IS NULL))
  AND (([model] LIKE COALESCE(@model, [model]) + '%' ESCAPE '\')
       OR (@model IS NULL AND [model] IS NULL))

ご理解のとおり、IFはT-SQlの手続き型コードです。 insert / update / delete / selectステートメントで使用することはできません。2つのステートメントのどちらを実行するかを決定するためにのみ使用できます。ステートメント内でさまざまな可能性が必要な場合は、上記のようにするか、CASEステートメントを使用できます。

IsNullまたはCoalesce関数も使用できます

Where accomodationTypeFK = IsNull(@accomodationFK, accomodationTypeFK)
    And regionFK = Coalesce(@regionFK,regionFK)
    And sleeps = IsNull(@sleeps,sleeps ) 
    And price Between IsNull(@priceFloor, Price) And IsNull(priceCeil, Price)  

これは、上記のマイケルの提案と同じことを行います...

IsNull()およびCoalesce()はほぼ同じ方法で機能し、iSNullは2つの引数のみを許可し、Coalesceは任意の数を取ることができることを除き、リストの最初の非NULL引数を返します...

http:/ /blogs.msdn.com/sqltips/archive/2008/06/26/differences-between-isnull-and-coalesce.aspx

SQLステートメント全体をIFステートメントで囲んでみてください。つまり、条件ごとに1つのSQLステートメントがあります。それは私のために働いた。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top