Есть ли лучший способ выполнить этот SQL-запрос? - PullRequest
2 голосов
/ 29 марта 2012
DECLARE @MinPV MONEY            -- PSV
DECLARE @MaxPV MONEY            -- PSV
DECLARE @MinGV MONEY            -- GV
DECLARE @MaxGV MONEY            -- GV
DECLARE @MinLBV MONEY           -- LBV
DECLARE @MaxLBV MONEY           -- LBV
DECLARE @MinRBV MONEY           -- RBV
DECLARE @MaxRBV MONEY           -- RBV
SET @MinPV = 5                  -- PSV
SET @MaxPV = 0                  -- PSV
SET @MinGV = NULL               -- GV
SET @MaxGV = NULL               -- GV
SET @MinLBV = NULL              -- LBV
SET @MaxLBV = NULL              -- LBV
SET @MinRBV = NULL              -- RBV
SET @MaxRBV = NULL              -- RBV

SELECT psv,* 
FROM Distributordetail
WHERE 
    (PSV BETWEEN @MinPV AND @MaxPV) OR          -- Both @MinVol and @MaxVol supplied
    (PSV > @MinPV AND @MaxPV IS NULL) OR        -- Only @MinVol supplied
    (PSV < @MaxPV AND @MinPV IS NULL) OR        -- Only @MaxVol supplied

В предложении WHERE есть 4 строки, мне нужно будет добавить МНОЖЕЕ больше строк для каждого передаваемого параметра. Может кто-нибудь еще сказать мне, есть ли лучший способ сделать это?

Отредактировано:

(PSV BETWEEN @MinPV AND @MaxPV) OR          -- Both @MinVol and @MaxVol supplied
(PSV > @MinPV AND @MaxPV IS NULL) OR        -- Only @MinVol supplied
(PSV < @MaxPV AND @MinPV IS NULL) OR        -- Only @MaxVol supplied
(@MinPV IS NULL AND @MaxPV IS NULL)         -- Neither @MinVol and @MaxVol supplied
(GSV BETWEEN @MinGV AND @MaxGV) OR          -- Both @MinVol and @MaxVol supplied
(GSV > @MinGV AND @MaxGV IS NULL) OR            -- Only @MinVol supplied
(GSV < @MaxGV AND @MinGV IS NULL) OR            -- Only @MaxVol supplied
(@MinGV IS NULL AND @MaxGV IS NULL)         -- Neither @MinVol and @MaxVol supplied

1 Ответ

4 голосов
/ 29 марта 2012

Объявите 2 дополнительные переменные, содержащие значения min и max для типа данных MONEY , а затем замените эти значения на NULL.

EDIT: так как вы хотитеисключив результат, если оба параметра NULL, перед выполнением запроса я выполню условную проверку перед изменением значения параметра с NULL на @MoneyMin или @MoneyMax:

DECLARE @MoneyMin MONEY
DECLARE @MoneyMax MONEY

SET @MoneyMin = -922,337,203,685,477.5808
SET @MoneyMax = 922,337,203,685,477.5807

IF (@MinPV IS NOT NULL OR @MaxPV IS NOT NULL)
    SELECT @MinPV = ISNULL(@MinPV, @MoneyMin), @MaxPV = ISNULL(@MaxPV, @MoneyMax)

IF (@MinGV IS NOT NULL OR @MaxGV IS NOT NULL)
    SELECT @MinGV = ISNULL(@MinGV, @MoneyMin), @MaxGV = ISNULL(@MaxGV, @MoneyMax)

SELECT psv,* 
FROM Distributordetail
WHERE 
    (PSV BETWEEN @MinPV AND @MaxPV) OR
    (GSV BETWEEN @MinGV AND @MaxGV)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...