Создание динамического запроса с использованием случая в месте нахождения

У меня есть хранимая процедура, и я хочу реализовать следующий запрос, используя Case Statement, но я не уверен, как это сделать. Здесь присутствует псевдокод того, что я хочу:

declare @PI_X decimal(18); declare @PI_y decimal (18); SELECT F1, F2,F3 FROM TABLE T WHERE CASE WHEN @PI_X IS NULL THEN @PI_Y = TY WHEN @PI_Y IS NULL THEN @PI_X = TX 

Кажется, что использование аргумента case для условий неверно и для values .

ЗАМЕТКА:

Я хочу запустить этот запрос на сервере DB2 и SQL, но на самом деле поставщик базы данных не важен для меня, используя динамический запрос sql и (OR), в котором предложение имеет производительность. и я не хочу этого. Мне очень нравится знать, как можно достичь такой логики, используя случай в where clause.

Не могли бы вы помочь мне справиться с этой проблемой. Любая помощь и предложения будут так оценены.

Я не уверен, почему ваш вопрос отмечен как SQL Server, так и DB2 … Но я буду считать SQL Server …

 declare @PI_X decimal(18); declare @PI_y decimal (18); SELECT T.F1, T.F2, T.F3 FROM TABLE T WHERE (@PI_X = TX OR @PI_X IS NULL) AND ((@PI_y = TY OR @PI_y IS NULL) OPTION (RECOMPILE); -- Prevent's the forced scan operation cause by the use of "optional" parameters. 

Результатом выражения CASE является значение , а не выражение. Вы не можете использовать выражение CASE для определения того, какой код будет работать. Вы можете использовать его только для выбора того, какое значение будет использоваться с вашим кодом.

В этом случае вы можете выполнить свою задачу следующим образом:

 declare @PI_X decimal(18); declare @PI_y decimal (18); SELECT F1, F2,F3 FROM TABLE T WHERE 1 = CASE WHEN @PI_X IS NULL AND @PI_Y = TY THEN 1 WHEN @PI_X IS NOT NULL AND @PI_Y IS NULL AND @PI_X = TX THEN 1 ELSE 0 END 

Вы также можете попробовать:

 declare @PI_X decimal(18); declare @PI_y decimal (18); SELECT F1, F2,F3 FROM TABLE T WHERE coalesce(@PI_X, TX) = TX AND coalesce(@PI_y, TY) = TY 

Хотя этот второй вариант может привести к неожиданным результатам, если @PI_y может быть чем-то иным, чем NULL когда NULL @PI_x имеет значение. Если вы можете гарантировать, что одна или другая из двух переменных будет иметь значение, но никогда и то и другое, то вы также можете упростить первый вариант, чтобы удалить дополнительный @PI_X IS NOT NULL AND часть выражения.

Вы можете попробовать поставить условие if, которое будет читаемым, но увеличивая количество строк кода.

 if(@PI_X IS NULL) begin select .... where TY=@PI_Y end else begin select .... where TX = @PI_X end 

Вместо использования OR в WHERE вы также можете создать 2 отдельных запроса и использовать IF...ELSE... чтобы решить, какой из них использовать; что-то вроде того, что предложил Coder1991. Или вы можете использовать конструкцию UNION ALL чтобы избежать IF и устранить любое разветвление.

 SELECT F1, F2,F3 FROM TABLE T WHERE @PI_X IS NULL AND @PI_Y = TY UNION ALL SELECT F1, F2,F3 FROM TABLE T WHERE @PI_Y IS NULL AND @PI_X = TX