Как сделать оператор SQL для возврата всех строк, когда переменная пуста, в противном случае возвращаются только совпадения - PullRequest
2 голосов
/ 14 сентября 2009

Как использовать оператор SQL для возврата всех строк, если входной параметр пуст, в противном случае только те строки, которые совпадают?

Мой SQL выглядит так

where person.personstatusuid = @StatusUID
           AND person.forename != ''
           AND person.location = @Location

но я хочу в основном, person.location = @Location ИЛИ @Location пусто

Как мне это сделать? Использование CASE, КОГДА возможно ...

Ответы [ 4 ]

2 голосов
/ 14 сентября 2009
SELECT  *
FROM    mytable
WHERE   person.personstatusuid = @StatusUID
        AND person.forename != ''
        AND person.location = @Location
UNION ALL
SELECT  *
FROM    mytable
WHERE   person.personstatusuid = @StatusUID
        AND person.forename != ''
        AND @Location IS NULL

Это решение, в отличие от использования OR, дружественно для индекса: оно оптимизирует избыточный SELECT и будет использовать индекс.

См. Эту статью в моем блоге для аналогичной проблемы с деталями производительности:

(это для MySQL, но также применимо и к SQL Server)

2 голосов
/ 14 сентября 2009

Просто используйте ИЛИ?

where person.personstatusuid = @StatusUID
AND person.forename != ''
AND (person.location = @Location or IsNull(@location,'')='')
1 голос
/ 14 сентября 2009

Если person.location не допускает нулевые значения, будет работать и следующее ...


where person.personstatusuid = @StatusUID
AND person.forename != ''
AND person.location = isnull(@Location,person.location)

Предполагается, что если требуются все строки, то @Location передается как ноль, а не как пустая строка ('')

1 голос
/ 14 сентября 2009

Вы можете использовать простое условие ИЛИ:

where person.personstatusuid = @StatusUID
           AND person.forename != ''
           AND (person.location = @Location OR @Location IS NULL)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...