SQL: динамическое предложение Where с использованием оператора IN, умирающего на записях со значениями NULL - PullRequest
2 голосов
/ 27 июля 2010

Я пытаюсь реализовать функцию поиска для нашей базы данных через веб-сайт. База данных имеет одну основную таблицу и пять таблиц, которые имеют внешний ключ к главному (подробные таблицы). Подробные таблицы содержат значения NULL, которые можно подключить к таблицам поиска в приложении. Я хочу позволить пользователю выбрать любое / все значения из таблицы поиска и передать его хранимой процедуре в виде строки, разделенной запятыми. Проблема, с которой я столкнулся, связана с тем, что запись имеет значения NULL, потому что она возвращает UNKNOWN, поэтому я не получаю никаких строк назад.

вот пример того, что я хочу в предложении where:

ПСЕВДОКОД

Input Variable
  @StateIDs VARCHAR(MAX)

  @StateIDs = '1, 2, 3' //I have a split function to split this up
    //@StateIDs could have zero or all 50 states in it so this needs to work with either

  WHERE
    State.StateID IN (udf_SplitAndCoalesce(@StateIDs, State.StateID, ','))

    //udf_SplitAndCoalesce is used to split up the csv input parameter and if that is null to return the current value in the record in the table

This works unless @StateIDs = NULL the where clause becomes

    WHERE State.StateID IN (State.StateID)

, что нормально, если State.StateID = NULL, тогда становится

WHERE State.StateID IN (NULL)

, который вернет UNKNOWN (без строк)

Если список csv в @StateIDs равен нулю, тогда я действительно не хочу, чтобы эта часть предложения Where была там, но я не знаю способа исключения или включения целых операторов по условию. Самая большая проблема в том, что существует около двадцати различных входных данных, поэтому я не могу просто написать два разных оператора выбора, один, когда @StateIDs не равен нулю, и один, когда он есть.

В конечном итоге я пытаюсь создать динамическое предложение where без выполнения оператора в виде строки, используя sp_executesql.

Я работаю над этим уже пару дней и создаю кучу разных решений, но каждое из них не совсем то, что мне нужно, и все сводится к работе с NULL.

Любая помощь, которую мне могут оказать люди, будет очень признательна.

1 Ответ

2 голосов
/ 27 июля 2010

Вам придется обновить каждое предложение WHERE, но можете ли вы сделать что-то подобное (обратите внимание, что предложение WHERE заключено в круглые скобки)?

WHERE
    (State.StateID IN (udf_SplitAndCoalesce(@StateIDs, State.StateID, ',')) 
        OR @StateIDs IS NULL)

Если @StateIDs равно NULL, то OR @StateIDs IS NULL Предложение будет эффективно возвращать все строки, как если бы оператора IN там не было, поскольку весь оператор будет иметь значение TRUE.

...