#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