变量中的SQL比较运算符
我试图在存储过程中编写一个查询,我希望比较运算符是一个变量 例如,下面是我的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 是否可以在变量中放置比较运算符?如果没有,如何更好地编写此查询,
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;