在sql WHERE子句中使用变量进行操作

时间:2015-11-02 19:02:49

标签: sql sql-server

我不是任何方式的数据库管理员,所以如果语义看起来有点离奇,我道歉。 在SQL Server中,是否可以将变量用于比较运算符,如此?

declare @compare = '>';
declare @limit = '5';

select agentId, sessionId, duration
from table_x
where duration @compare @limit

根据变量的不同,我不想写很多行,这就是我要问的原因。更不用说如果我抛出另一个变量,这进一步使得线的数量更大。此外,我喜欢它是可扩展的这一事实,因此如果有一个额外的运算符,它无论如何都会处理它。

感谢您的帮助!

3 个答案:

答案 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子句中的这些类型的操作,因为它们排除了索引的使用。此外,此结构不适用于字符串或日期,但它适用于数字。