In SQL Используйте «case when» для разных столбцов в зависимости от условия в предложении where - PullRequest
0 голосов
/ 06 августа 2020

Я пытаюсь написать хранимую процедуру, в которой я мог бы применять фильтры к различным столбцам в зависимости от условий. Здесь я использую Case When в предложении where.

SELECT * 
FROM [Table]
WHERE 
   Col = @ColValue
   And
   CASE @Parameter 
   WHEN 'Value1' THEN Column1 = @Col1Value
   WHEN 'Value2' THEN Column2 = @Col2Value...

Что-то похожее на этот запрос, где я мог бы применить фильтр к различным столбцам на основе условия или параметров, переданных в хранимую процедуру.

Ответы [ 3 ]

1 голос
/ 06 августа 2020

Не используйте case. Просто используйте basi c logi c:

WHERE Col = @ColValue AND
      ( (@Parameter = 'Value1' AND Column1 = @Col1Value) OR
        (@Parameter = 'Value2' AND Column1 = @Col2Value) OR
        (@Parameter IS NULL)
      )

Тем не менее, вы должны быть осторожны с хранимыми процедурами и производительностью. Вы можете захотеть перекомпилировать logi c - или даже использовать Dynami c SQL - чтобы быть уверенным, что сгенерирован наиболее эффективный план запроса для заданных параметров. Но это другое дело.

0 голосов
/ 01 сентября 2020

Вот точное значение logi c для применения случая, когда в предложении where для сопоставления разных столбцов с разными параметрами.

SELECT * 
FROM [Table]
WHERE
CASE @Parameter
WHEN value1 THEN Column1
WHEN value2 THEN Coumn2
END
=
CASE @Parameter
WHEN value1 THEN @ParameterValue1
WHEN value2 THEN @ParameterValue2
END

Здесь, в зависимости от значения параметра, мы выбираем столбец и соответствующее значение, в котором пункт.

0 голосов
/ 06 августа 2020
SELECT * FROM TableName
WHERE
    (@Condition = 1
    AND ColumnName1 = 'xxxx')
OR
    (@Condition = 0
    AND ColumnName1 = 'xxxx'
    AND ColumnName2 = 'yyyy')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...