Sql Где предложение с условием либо установить, где предложение равно переданному значению, либо, если переданное значение равно нулю, чтобы установить, где предложение равно "IS NULL" - PullRequest
1 голос
/ 28 января 2020

Извините за запутанный заголовок, но я не смог придумать наш лучший заголовок. Я объясню более подробно здесь

У меня есть две таблицы. Первая таблица будет возвращать результаты, подобные приведенным ниже

enter image description here

Во второй таблице будет больше подробностей, основанных не только на «Коде», но и на « SubCode 'И будет возвращать результаты, подобные приведенным ниже

enter image description here

Я использую таблицы, чтобы показать подробный отчет мастера, причем первая таблица является мастером и вторая таблица - это детали, поэтому, например, я бы собрал все детали, связанные с «кодом» и «подкодом» мастера.

Как видите, «SubCode» может иметь значение NULL. Поэтому, когда я пытаюсь выполнить мой подробный запрос, я сталкиваюсь с проблемой, как выполнить предложение where

SELECT Description, Amount 
FROM TABLE2 
WHERE Code = (@AccountCodeParam) 
  AND SubCode = CASE 
                   WHEN (@SubCodeParam) IS NOT NULL 
                      THEN (@SubCodeParam) 
                      ELSE IS NULL

Это запрос, который я пробовал, но он не будет работать из-за части где 'SubCode =' прерывает 'ELSE IS NULL'

Я не могу сделать оператор OR, потому что он возвращает результаты Table2, которые имеют 'SubCode' = NULL со строками таблицы, которые имеют 'SubCode'

Я неправильно настроил свой первый запрос? или есть другой способ сделать это, любая помощь приветствуется спасибо!

Ответы [ 3 ]

2 голосов
/ 28 января 2020

Вы пробовали что-то вроде

SELECT Description, Amount 
  FROM TABLE2 
 Where Code = (@AccountCodeParam)
   And 
    ((SubCode = @SubCodeParam) OR (@SubCodeParam IS NULL AND SubCode IS NULL))

Условие or верно, когда Subcode и SubcodeParam не равны нулю и не равны или оба равны нулю, что, как я понимаю, то, что вы хотите-

1 голос
/ 28 января 2020

Вы можете предпочесть сделать это так, так как это более читаемый код, чем использование OR. Имейте в виду, что он также предотвращает использование индекса на SubCode, поскольку предикат основан на вызове функции, но он все же может предложить лучшую производительность, чем запрос OR, из-за большого влияния на оценки количества элементов логического или. Это может иметь значение, если в вашей таблице много данных.

SELECT Description, Amount
  FROM TABLE2
 WHERE Code = @AccountCodeParam
   AND ISNULL(SubCode, -1) = ISNULL(@SubCodeParam, -1)

ссылка ISNULL

Убедитесь, что значение, выбранное для замены NULL, имеет значение не встречаются в ваших реальных данных.

1 голос
/ 28 января 2020

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

SET ANSI_NULLS OFF;

DECLARE @SubCodeParam varchar(20) = null;

SELECT Description, Amount 
FROM TABLE2 
WHERE Code = (@AccountCodeParam) 
  AND SubCode = @SubCodeParam;

Это не «правильный способ» сделать это. Я показываю его вам только в том случае, если вы видите его в существующем приложении.

Для нового кода используйте { ссылка }

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...