我不是任何方式的数据库管理员,所以如果语义看起来有点离奇,我道歉。 在SQL Server中,是否可以将变量用于比较运算符,如此?
declare @compare = '>';
declare @limit = '5';
select agentId, sessionId, duration
from table_x
where duration @compare @limit
根据变量的不同,我不想写很多行,这就是我要问的原因。更不用说如果我抛出另一个变量,这进一步使得线的数量更大。此外,我喜欢它是可扩展的这一事实,因此如果有一个额外的运算符,它无论如何都会处理它。
感谢您的帮助!
答案 0 :(得分:3)
实际上,您可以通过保护表达式调用不同的运算符:
DECLARE @comparison varchar(2) = '>'
DECLARE @limit int 5 = 123
SELECT
Foo
FROM
Table
WHERE
( @comparson = '>' AND Duration > @limit )
OR
( @comparson = '<' AND Duration < @limit )
OR
( @comparson = '=' AND Duration = @limit )
OR
( @comparson = '<>' AND Duration <> @limit )
为了概括这一点,您可以将其转换为UDF并在多个位置使用它:
CREATE FUNCTION VariableComparison(@comparison AS varchar(2), @value as numeric, @operand as numeric) RETURNS bit AS
BEGIN
RETURN ( @comparison = '>' AND @value > @operand )
OR
( @comparison = '<' AND @value < @operand )
OR
( @comparison = '=' AND @value = @operand )
OR
( @comparison = '<>' AND @value <> @operand )
END
像这样使用:
SELECT
...
WHERE
dbo.VariableComparison( @comparison, Duration, @limit ) = 1
答案 1 :(得分:0)
您可以尝试使用动态SQL执行此操作,例如
declare @compare varchar(2) = '>';
declare @limit int = '5';
declare @dynamicQuery = nvarchar(max) = N'select agentId, sessionId, duration
from table_x
where duration' + @compare + @limit
EXEC(@dynamicQuery)
答案 2 :(得分:0)
对数字进行各种比较的一种方法是使用sign()
:
where sign(duration - limit) = (case when @compare = '=' then 0
when @compare = '>' then 1
when @compare = '<' then -1
end)
但是,不推荐WHERE
子句中的这些类型的操作,因为它们排除了索引的使用。此外,此结构不适用于字符串或日期,但它适用于数字。