문제

일부 매개 변수가 선택 사항 인 검색 결과를 반환하기 위해 저장된 절차를 만들고 있습니다.

나는 나의 "if 문"을 원한다 어디 조항이지만 작동하지 않습니다. 그만큼 어디 절은 널이 아닌 매개 변수 만 필터링해야합니다.

여기에 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))

다른 팁

우리는 많은 것을 사용했습니다 COALESCE 과거에 "조항이있는 곳"당신이 말하는 것처럼.

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 '\')

큰 문제는 exciption이 불가능한 열을 선택적으로 필터링하려고 할 때 발생합니다 ... 열의 데이터가있는 경우 null 주어진 행의 경우 사용자가 해당 열에 의해 검색 할 내용을 입력하지 않았습니다 (따라서 사용자 입력도 null), 그때 그 행 결과에도 나타나지 않습니다 (필터가 선택 사항 인 경우 배제 동작이 잘못되었습니다).

무효 필드를 보상하기 위해, 당신은 마찬가지로 SQL처럼 보이는 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))

T-SQL의 절차 코드라면 이해합니다. 삽입/업데이트/삭제/선택 문에 사용됩니다. 실행하려는 두 가지 명령문 중 하나를 결정하는 데 사용할 수 있습니다. 성명서 내에서 다른 가능성이 필요한 경우 위와 같이 수행하거나 사례 진술을 사용할 수 있습니다.

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)  

이것은 위의 Michael의 제안과 똑같은 일입니다 ...

isnull () 및 Coalesce ()는 거의 동일한 방식으로 작동하며, ISNULL이 2 개의 인수 만 허용하는 것을 제외하고는 목록에서 첫 번째 비 널 인수를 반환하며 Coalesce는 숫자를 취할 수 있습니다 ...

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

전체 SQL 문에 IF 문을 두십시오. 즉, 각 조건에 대해 하나의 SQL 문이 있습니다. 그것은 나를 위해 일했다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top