хранимых - хранимые процедуры sql




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

В качестве альтернативы параметрам ISNULL / COALESCE вы можете проверить параметры на null:

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

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

Предположим, что есть хранимая процедура с тремя параметрами. Из всех возможностей, я ищу, чтобы достичь этого с помощью одного 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.


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

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, чтобы избежать нулевого сравнения.


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

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 = 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    






sql-server-2008