데이터베이스 검색을위한 위치에있는 SQL IF 문
-
11-07-2019 - |
문제
일부 매개 변수가 선택 사항 인 검색 결과를 반환하기 위해 저장된 절차를 만들고 있습니다.
나는 나의 "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 문이 있습니다. 그것은 나를 위해 일했다.