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