变量中的SQL比较运算符

变量中的SQL比较运算符,sql,Sql,我试图在存储过程中编写一个查询,我希望比较运算符是一个变量 例如,下面是我的SQL查询: DECLARE @DueDate dateTime = '2019-11-29' DECLARE @DueDateOperator varchar = '>' SELECT * FROM someTable WHERE dueDate [@DueDateOperator] @DueDate --This doesn't work 是否可以在变量中放置比较运算符?如果没有,如何更好地编写此查询,

我试图在存储过程中编写一个查询,我希望比较运算符是一个变量

例如,下面是我的SQL查询:

DECLARE @DueDate dateTime = '2019-11-29'
DECLARE @DueDateOperator varchar = '>'

SELECT * 
FROM someTable 
WHERE dueDate [@DueDateOperator] @DueDate --This doesn't work

是否可以在变量中放置比较运算符?如果没有,如何更好地编写此查询,以便将比较运算符参数化为任何内容,如
=
。如果可能,请尝试以下操作:

    Declare @DueDate dateTime = '2019-11-29'
    Declare @DueDateOperator varchar = '>'
    Declare @sql Nvarchar(MAX) = ''
    Set  @sql = 'Select * from someTable where dueDate ' + @DueDateOperator +  ' '''+ convert(varchar, @DueDate, 23) +  ''' '
    EXECUTE (@sql )

--print  ( @sql)

您可以按如下方式使用动态SQL:

DECLARE @DueDate dateTime = '2019-11-29'
DECLARE @DueDateOperator varchar = '>'
DECLARE @Cmd NVARCHAR(4000) = 'SELECT * FROM someTable WHERE dueDate ' + @DueDateOperator + ''''  + CONVERT( NVARCHAR(10), @DueDate , 23)   + '''' 

SELECT @Cmd

EXECUTE(@Cmd)

您的代码看起来像SQL Server。首先,避免声明没有长度的变量。这是一个等待发生的错误:

DECLARE @DueDateOperator varchar = '>'; 
为了好玩,你可以考虑一下如果你使用
或”!=”会有什么结果。始终使用长度:

DECLARE @DueDateOperator varchar(32) = '>'; 
那么,最安全的处理方法就是布尔表达式

SELECT * 
FROM someTable 
WHERE (DueDateOperator = '=' AND dueDate = @DueDate) OR
      (DueDateOperator = '<>' AND dueDate <> @DueDate) OR
      (DueDateOperator = '<' AND dueDate < @DueDate) OR
      (DueDateOperator = '<=' AND dueDate <= @DueDate) OR
      (DueDateOperator = '>' AND dueDate > @DueDate) OR
      (DueDateOperator = '>=' AND dueDate >= @DueDate) ;

虽然在动态SQL中不能将运算符作为参数传入,但可以传递常量值。这使用了
sp\u executesql
,它允许传递参数。

您可以使用动态SQL来实现。但是SQL!=哎呀。写一个以上的查询没有什么丢脸的。你不应该在你的问题中添加一个标记
rdbms
,你应该添加一个与你实际使用的rdbms相对应的标记,例如
oracle
mysql
postgresql
sqlserver
,或者你可能正在使用的任何东西!!SQL没有变量。看起来像T-SQL(Microsoft SQL Server)
declare @DueDate dateTime = '2019-11-29';
declare @DueDateOperator varchar(32) = '>';
DECLARE @sql nvarchar(max) = '
select *
from sometable
where dueDate @DueDateOperator @DueDate';

set @sql = replace(@sql, '@DueDateOperator', @DueDateOperator);

exec sp_executesql @sql,
                   N'@DueDate datetime',
                   @DueDate @DueDate;