Как написать условный запрос SELECT в TSQL, используя аргументы в предложении WHERE / AND? - PullRequest
2 голосов
/ 30 июля 2011

У меня есть хранимая процедура, которая возвращает почтовые индексы в указанном радиусе.Аргументы:

ALTER PROCEDURE [dbo].[proximitySearch] 
    @proximity int = 0,
    @country varchar (2) = NULL,
    @city varchar (180) = NULL,
    @state varchar (100) = NULL,
    @stateAbr varchar (2) = NULL,
    @postalCode varchar(20) = NULL
AS...

В процедуре первый запрос должен выбрать одну запись (или ни одной записи), которая соответствует тому, что было передано, и назначить широту / долготу локальным переменным, как я началнапишите ниже:

SELECT TOP 1 @Longitude = Longitude, @Latitude = Latitude
FROM   PostalCodes
WHERE  ...

Вот где я озадачен ... Предложение WHERE должно быть условным в зависимости от того, что было передано. Некоторые аргументы (или все они) могут быть NULL, и я неЯ не хочу использовать их в запросе, если они есть.

Я думал так:

SELECT TOP 1 @Longitude = Longitude, @Latitude = Latitude
FROM   PostalCodes
WHERE Longitude IS NOT NULL
AND CASE WHEN @postalCode IS NOT NULL THEN PostalCode = @postalCode ELSE 1 END

... но это не работает.Как это обычно делается?(Я определенно не опытный парень TSQL !!!) Заранее спасибо!

Ответы [ 2 ]

2 голосов
/ 30 июля 2011

Существует несколько способов реализации такой логики:

1)

SELECT TOP 1 @Longitude = Longitude, @Latitude = Latitude
FROM   PostalCodes
WHERE Longitude IS NOT NULL
AND (@postalCode IS NULL OR PostalCode = @postalCode)

2)

SELECT TOP 1 @Longitude = Longitude, @Latitude = Latitude
FROM   PostalCodes
WHERE Longitude IS NOT NULL
AND PostalCode = COALESCE(@postalCode, PostalCode)
2 голосов
/ 30 июля 2011
SELECT TOP 1 @Longitude = Longitude, @Latitude = Latitude
FROM   PostalCodes
WHERE 
      ((@postalCode IS NULL) OR (PostalCode = @postalCode))
  AND ((@someotherparam IS NULL) OR (someothercolumn = @someotherparam))  etc...

Но имейте в виду, что эта техника может страдать от "перехвата параметров"

...