Включайте и AND в предложение where, только если поле имеет положительную длину - PullRequest
0 голосов
/ 02 ноября 2011

пытается добавить условное И.

Я не хочу проверять соответствие поля данных, если в @Data ничего нет

select distinct mo.ModelId,
                mo.ModelName        
from Model mo
     join MaModelar mmy on mmy.ModelID = mo. ModelID
     join [Application] a on a.MaModelar ID = mmy.MaModelar ID
     join Appltitle t on t.ApplTID = a.ApplicationID
where mmy.MakeId = 331
    CASE 
        WHEN LEN(t.Name) > 0
        THEN
            and (t.Name = 'A.T.V.') 
        END
order by mo.ModelName asc

Позвольте мне подвести итог другими словами:

Я не хочу запрашивать (Modelid AND @Note), если @Note недействительно. Неверный означает, что @Note является пустым или нулевым. Поэтому я пытаюсь добавить некий условный оператор, который сначала проверяет @Note и, если он действителен, включает его в предложение where как AND. Поэтому, если @Note допустимо (len> 1), тогда этот запрос должен включать mmy.MakeId = 331 AND t.Data = 'A.T.V.'.

Если @Note недопустимо, тогда в запросе будет просто WHERE mmy.MakeId = 331 и пропущено AND, и он не будет пытаться проверить @Note вместе с mmy.MakeId.

Я тоже это попробовал:

select distinct mo.ModelId,
        mo.ModelName        
from Model mo
     join MaModelar mmy on mmy.ModelID = mo. ModelID
     join [Application] a on a.MaModelar ID = mmy.MaModelar ID
     join Appltitle t on t.ApplTID = a.ApplicationID
WHEN LEN(LTRIM(RTRIM(@Name))) < 1
    THEN where mmy.ModelId = @ModelId
ELSE
    where mmy.ModelId = @ModelId
    AND substring(n.Name, CHARINDEX(']', n.Name) + 2, LEN(n.Name)) = @Name

Ответы [ 4 ]

2 голосов
/ 02 ноября 2011

использовать

select distinct mo.ModelId,
                mo.ModelName        
from Model mo
     join MaModelar mmy on mmy.ModelID = mo. ModelID
     join [Application] a on a.MaModelar ID = mmy.MaModelar ID
     join Appltitle t on t.ApplTID = a.ApplicationID
where mmy.MakeId = 331 AND ( LEN(t.Data) < 1 OR t.Data = 'A.T.V.')
order by mo.ModelName asc

РЕДАКТИРОВАТЬ - согласно комментариям:

попробовать

select distinct mo.ModelId,
                mo.ModelName        
from Model mo
     join MaModelar mmy on mmy.ModelID = mo. ModelID
     join [Application] a on a.MaModelar ID = mmy.MaModelar ID
     join Appltitle t on t.ApplTID = a.ApplicationID
where mmy.MakeId = 331 AND t.Data = 'A.T.V.'
order by mo.ModelName asc
1 голос
/ 02 ноября 2011

Просто вложенный фильтр:

WHERE mmy.MakeID = 331
AND (T.Data = '' OR t.Data = 'A.T.V.')

Использование функции LEN сделает запрос не SARGable, поэтому я бы избежал этого, если это возможно.

0 голосов
/ 04 ноября 2011

Просто измените свой и пункт на

AND 
  (substring(n.Name, CHARINDEX(']', n.Name) + 2, LEN(n.Name)) = @Name

     or @Name is null) 

Примечание. Невозможно принудительно заставить механизм БД замкнуть условие ИЛИ.

Я также делаю это в некоторых случаях

DECLARE @IsNameEmpty bit 

IF @Name is null or @Name = '' or @Name = 'Some Special value'
   @IsNameEmpty = 1
else
   @IsNameEmpty = 0

и затем я делаю это вместо

AND 
     (substring(n.Name, CHARINDEX(']', n.Name) + 2, LEN(n.Name)) = @Name

     or @IsNameEmpty = 1) 

Что облегчает задачу, если у меня есть запрос, который использует @Name несколько раз, и мне не хочется писать каждое условие.

0 голосов
/ 02 ноября 2011

вам не нужно беспокоиться о пустых полях.Ваша проверка t.Data = 'ATV' не будет выполнена, если столбец пуст.

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