Подтвердить что ты не робот

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

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

4b9b3361

Ответ 1

В качестве альтернативы параметрам 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) 

Ответ 2

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

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

Ответ 3

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

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)

Ответ 4

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    

Ответ 5

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

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