Фильтр получает только одно условие

#sql #tsql

#sql #tsql

Вопрос:

У меня есть проверка в предложении WHERE, например:

                          ...
                         AND (@BDOnly = 0
                             OR [DT].[Abbreviation] = @IsBDChecked)
                         AND (@CDOnly = 0
                             OR [DT].[Abbreviation] = @IsCDChecked)
                         AND (@PPOOnly = 0
                             OR [DT].[Abbreviation] = @IsPPOChecked)
                         AND (@FBOMOnly = 0
                             OR [DT].[Abbreviation] = @IsFBOMChecked)
                         AND (@APOnly = 0
                             OR [DT].[Abbreviation] = @IsAPChecked)
                         AND (@COOnly = 0
                             OR [DT].[Abbreviation] = @IsCOChecked)
  

Поэтому каждое предложение AND проверяет, является ли boolean битовым значением 0 или 1 , если это 0 просто сделайте any, но если это 1 , то сделайте filter. Моя проблема в том
если я отправляю два со значением 1 , я имею в виду

@BDOnly = 1 и @CDOnly = 1 он фильтрует только один из них, вместо этого я имею в виду два фильтра:

 [DT].[Abbreviation] = @IsBDChecked
  

и

  [DT].[Abbreviation] = @IsCDChecked
  

Что я делаю не так? С уважением

Комментарии:

1. Каково значение @IsBDChecked , @IsCDChecked и Abbreviation записи, которая, по вашему мнению, неправильно отфильтрована?

2. Вы найдете то, что вам нужно здесь .

3. Это всего лишь строка, я думаю, что проблема в И закрывается, потому что он фильтрует только один из них, результат моего желания — получить фильтр по строке 1 и фильтр по строке 2, поэтому результат должен содержать комбинацию двух строковых значений @MarcinJ

4. Нет, вы видите, что если это просто строка, строка (сокращение) не может равняться двум разным строкам (двум переменным). Вот почему важно, чтобы вы сообщили нам, каковы эти значения и могут быть, иначе мы не сможем вам помочь.

Ответ №1:

Я собираюсь сделать предположение здесь, потому что данных недостаточно. Если вы хотите вернуть строку, в которой Abbreviation совпадение @IsBDChecked задано только при @BDOnly задании, а также другую строку, в которой Abbreviation совпадение @IsCDChecked задано при @CDOnly задании, попробуйте это:

                         (@BDOnly = 1
                         AND [DT].[Abbreviation] = @IsBDChecked)
                     OR (@CDOnly = 1
                         AND [DT].[Abbreviation] = @IsCDChecked)
                     OR (@PPOOnly = 1
                         AND [DT].[Abbreviation] = @IsPPOChecked)
                     OR (@FBOMOnly = 1
                         AND [DT].[Abbreviation] = @IsFBOMChecked)
                     OR (@APOnly = 1
                         AND [DT].[Abbreviation] = @IsAPChecked)
                     OR (@COOnly = 1
                         AND [DT].[Abbreviation] = @IsCOChecked)
  

Небольшой репрезентативный случай:

 DECLARE @ADOnly BIT = 0
      , @BDOnly BIT = 1
      , @CDOnly BIT = 1
      , @IsADChecked NVARCHAR(100) = 'A'
      , @IsCDChecked NVARCHAR(100) = 'C'
      , @IsBDChecked NVARCHAR(100) = 'B'



;WITH myTable AS 
(
    SELECT * FROM (VALUES ('A'), ('B'), ('C')) X(Abbreviation)
)
SELECT *
  FROM myTable
 WHERE (@ADOnly = 1 AND Abbreviation = @IsADChecked)
    OR (@BDOnly = 1 AND Abbreviation = @IsBDChecked)
    OR (@CDOnly = 1 AND Abbreviation = @IsCDChecked)
  

Выдает:

 Abbreviation
------------
B
C