SQL игнорирует часть WHERE, если параметр равен null
У меня есть хранимая процедура, которая извлекает информацию из таблицы на основе 4 параметров.
Я хочу получить значения на основе параметров, но если параметр NULL, этот параметр не проверяется. Поэтому, если все 4 параметра равны нулю, я бы показал всю таблицу.
Это мой SP (как вы можете видеть, это работает только для 1 параметра atm):
CREATE PROCEDURE myProcedure
@Param1 nvarchar(50),
@Param2 nvarchar(50),
@Param3 nvarchar(50),
@Param4 nvarchar(50)
AS
BEGIN
IF(@Param1 IS NULL)
BEGIN
SELECT Id, col1, col2, col3, col4 FROM myTable
END
ELSE
BEGIN
SELECT Id, col1, col2, col3, col4 FROM myTable WHERE col1 LIKE @Param1+'%'
END
END
Есть ли способ сделать это без наличия IF
для каждой возможной комбинации (15 IFs)?
Ответы
Ответ 1
Как насчет чего-то вроде
SELECT Id, col1, col2, col3, col4
FROM myTable
WHERE col1 LIKE @Param1+'%'
OR @Param1 IS NULL
в этом конкретном случае вы могли бы также использовать
SELECT Id, col1, col2, col3, col4
FROM myTable
WHERE col1 LIKE ISNULL(@Param1,'')+'%'
Но в общем вы можете попробовать что-то вроде
SELECT Id, col1, col2, col3, col4
FROM myTable
WHERE (condition1 OR @Param1 IS NULL)
AND (condition2 OR @Param2 IS NULL)
AND (condition3 OR @Param3 IS NULL)
...
AND (conditionN OR @ParamN IS NULL)
Ответ 2
CREATE PROCEDURE myProcedure
@Param1 nvarchar(50),
@Param2 nvarchar(50),
@Param3 nvarchar(50),
@Param4 nvarchar(50)
AS
BEGIN
IF(@Param1 IS NULL)
BEGIN
SELECT Id, col1, col2, col3, col4 FROM myTable
END
ELSE
BEGIN
SELECT Id, col1, col2, col3, col4 FROM myTable WHERE col1 LIKE @Param1+'%' OR @Param1 is Null
END
END
Это должно помочь
рассматривает
Ашутош Арья
Ответ 3
Если вы имеете в виду @param1 - параметр для col1, @param2 - параметр для col2,... и т.д.
Вы можете попробовать следующее:
CREATE PROCEDURE myProcedure
@Param1 nvarchar(50),
@Param2 nvarchar(50),
@Param3 nvarchar(50),
@Param4 nvarchar(50)
AS
BEGIN
declare @query nvarchar(4000)
SET @query='SELECT Id, col1, col2, col3, col4 FROM myTable '+
(case when ((@Param1 is null) and (@Param2 is null) and (@Param3 is null) and (@Param4 is null))
then ''
else
'where '+
(case when @Param1 is not null
then ' col1 like '''[email protected]+'%'''+
(case when @param2 is not null then ' AND ' else '' end)
else '' end)+
(case when @Param2 is not null
then ' col2 like '''[email protected]+'%'''+
(case when @param3 is not null then ' AND ' else '' end)
else '' end)+
(case when @Param3 is not null
then ' col3 like '''[email protected]+'%'''+
(case when @param4 is not null then ' AND ' else '' end)
else '' end)+
(case when @Param4 is not null
then ' col4 like '''[email protected]+'%'''
else '' end)
end)
exec sp_sqlexec @query
Ответ 4
Вы можете использовать функцию COALESCE()
на SQL-сервере. Вам не нужно использовать IF- Else
или CASE
в ваших заявлениях. Вот как вы можете использовать функцию COALESCE
.
SELECT Id, col1, col2, col3, col4 FROM myTable where col1 = COALESCE(NULLIF(@param1, ''), col1) and col2 = COALESCE(NULLIF(@param2, ''), col2) and col3 = COALESCE(NULLIF(@param3, ''), col3) and col4=
COALESCE(NULLIF(@param4, ''), col4)
Функция COALESCE
в SQL возвращает первое выражение, отличное от NULL, среди его аргументов. Здесь, например, если параметр @param1 равен нулю, функция вернет col1, которая приведет к col1 = col1 в инструкции where, которая равна 1 = 1, что условие всегда будет истинным.