我对SQL Server中的动态运算符有疑问。
举个例子,
select *
from table1
where field_1 = 'ABC'
我们可以动态更改' ='根据参数?假设上述查询是否在存储过程中,并且我们有一个名为@para
的参数。
我的问题是:
if @para = "x" then the '=' in the above query remains same
if @para = 'y' then '=' should change to '!='
可以这样做吗?
查询应该是
select *
from table1
where field_1 OPERATOR_FIELD 'ABC'
这个问题背后有一个原因。我有一个大型存储过程,并认为可以有一种简单的方法来动态更改操作符,而不是在整个地方编写CASE
语句。
答案 0 :(得分:4)
您可以将其写为:
where ((field_1 = 'ABC' and (@param = '=') ) or
(field_1 <> 'ABC') and (@param = '<>') )
)
否则您需要使用动态SQL。
答案 1 :(得分:1)
您可以使用动态SQL:
DECLARE @para VARCHAR(1) = 'y'
DECLARE @sql VARCHAR(MAX)
SET @sql =
'SELECT *
FROM table1
WHERE
field_1 ' + CASE WHEN @para = 'x' THEN '=' ELSE '!=' END + ' ''ABC'''
PRINT @sql
EXEC(@sql)
另一种方式:
SELECT *
FROM table1
WHERE
(@para = 'x' AND field_1 = 'ABC')
OR (@para = 'y' AND field_1 != 'ABC')
阅读Gail Shaw关于动态搜索查询的blog post。
以下是Erland Sommarskog的another post。
答案 2 :(得分:0)
第一个答案是最简单的方法 调试时动态查询有点复杂
让我们更改此方法中的查询
if @para = '='
begin
select *
from table1
where field_1 = 'ABC'
end
else
begin
select *
from table1
where field_1 <> 'ABC'
end