sql хранимых Необязательные аргументы в предложении WHERE




хранимые процедуры sql (4)

На этот вопрос уже есть ответ:

Предположим, что есть хранимая процедура с тремя параметрами. Из всех возможностей, я ищу, чтобы достичь этого с помощью одного WHERE , не выходя из-под контроля с использованием () AND () OR () слишком много ...

Пример:

    //Params
@CITY VARCHAR(100) = NULL,
@GENDER VARCHAR(100) = NULL,
@AGE VARCHAR(100) = NULL

Я полагаю, вы можете сделать это, используя IF BEGIN ... END для каждой переменной, если существует, но это делает код намного дольше, чем нужно.

Этот метод ниже не будет работать, потому что его слишком длинный (имеется около 10 различных полей, подобных этому, но пример равен только 3), и я не уверен, что он даже напрямую подтягивает отличительные значения ...

SELECT NAME FROM TABLE 
WHERE (
([email protected] AND [email protected] AND [email protected])
OR ([email protected] AND [email protected])
OR ([email protected] AND [email protected])
OR ([email protected] AND [email protected])
OR ([email protected])
OR ([email protected])
OR ([email protected])
)

Есть ли еще более эффективный способ сделать это?

Если да, желательно, чтобы метод был совместим с JOIN.


SELECT NAME   
FROM TABLE   
WHERE       
  City = case when isnull(@City ,'') = '' then City
                        else @City end
AND      
  Gender = case when isnull(@Gender ,'') = '' then Gender
                        else @Gender end
AND  
  Age = case when isnull(@Age ,0) = 0 then Age
                        else @Age end    

как насчет этого?

SELECT
    NAME
FROM TABLE 
WHERE CITY = COALESCE(@CITY, CITY)
    AND GENDER = COALESCE(@GENDER, GENDER)
    AND AGE = COALESCE(@AGE, AGE)

Попробуйте что-то вроде этого:

SELECT NAME 
FROM TABLE 
WHERE 
    City = IsNull(@City, City) AND
    Gender = IsNull(@Gender, Gender) AND
    Age = IsNull(@Age, Age)

ИЛИ ЖЕ:

SELECT NAME 
FROM TABLE 
WHERE 
    (City = @City OR @City IS NULL) AND
    (Gender = @Gender OR @Gender IS NULL) AND
    (Age = @Age OR @Age IS NULL)

Возможно, это:

create procedure myProc
    --Params
@CITY VARCHAR(100) = NULL,
@GENDER VARCHAR(100) = NULL,
@AGE VARCHAR(100) = NULL
as

SELECT NAME FROM [TABLE]
WHERE ISNULL(CITY,'')=ISNULL(@CITY,ISNULL(CITY,''))
AND ISNULL(GENDER,'')=ISNULL(@GENDER,ISNULL(GENDER,''))
AND ISNULL(AGE,'')=ISNULL(@AGE,ISNULL(AGE,''))
go

Предполагая, что столбцы в предложении WHERE имеют значение NULL, используйте ISNULL, чтобы избежать нулевого сравнения.





sql-server-2008