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, что условие всегда будет истинным.