gpt4 book ai didi

sql-server - T-SQL : Filter with Dynamic Comparison Operator (=, <=, >=, ...)

转载 作者:行者123 更新时间:2023-12-01 13:57:09 24 4
gpt4 key购买 nike

我正在创建一个报告工具,用户可以在其中选择一个运算符和 2 个值进行过滤。

我的基本表:

UserID     UserName
-------------------------------
1 User1
2 User2
3 User3
4 User4
5 User5

用户可以选择我想这样翻译的运算符:

Option      SQL Operator
------------------------------
between column between x and y
like column '%' + x + '%'
greater than column > x
less than column < x
equal to column = x
not equal to column <> x

我在想类似的东西:

... column = ISNULL(@parameter, column)

从某种意义上说,如果你传递一些东西或什么都不传递,它仍然会正确查询。

这是我正在使用的 TSQL (** DOES NOT WORK *):

declare @bwValue1 varchar(200) = '2', --between value 1
@bwValue2 varchar(200) = '4'; --between value 2

select * from users where
(UserID BETWEEN @bwValue1 AND @bwValue2
OR UserID != @bwValue1
OR UserID = @bwValue1
OR UserID < @bwValue1
OR UserID > @bwValue1
OR UserID LIKE '%' + @bwValue1 + '%');

有没有办法编写一个无论选择哪个运算符都能正确评估语句的 TSQL?

*最终答案*

对于任何好奇的人来说,这就是我最终得到的结果:

declare @fn varchar(200) = 'carl',
@Op varchar(3) = 'bw',
@bwValue1 varchar(200) = '978',
@bwValue2 varchar(200) = '2000'

select * from users where userfirstname like '%' + @fn + '%'
AND ((@Op = 'eq' AND (userid = @bwValue1))
OR (@Op = 'neq' AND (userid <> @bwValue1))
OR (@Op = 'lt' AND (userid < @bwValue1))
OR (@Op = 'gt' AND (userid > @bwValue1))
OR (@Op = 'li' AND (userid like '%' + @bwValue1 + '%'))
OR (@Op = 'bw' AND (userid between @bwValue1 and @bwValue2)))

最佳答案

动态 SQL 并不意味着您不能对其进行参数化并缓存计划。工作得很好,因为 SQL Server 无法区分。如果您的应用程序连接了一些 SQL 字符串(不包含动态文字!)SQL Server 将像对待任何其他查询一样对待它们。它缓存计划。当然,每个运营商都会产生不同的计划。如果查询可以以这种方式在索引上搜索,也许这就是您想要的!

因此,我建议您将查询设为静态,但运算符除外。

如果您无法做到这一点并且愿意放弃 SARGability,请执行以下操作:

WHERE 0=0
OR (Operator = '=' AND (A = B))
OR (Operator = '<' AND (A < B))
OR (Operator = '>' AND (A > B))
---...

OR 子句中的一个将在运行时变为“事件”。它看起来仍然可读和可维护。

关于sql-server - T-SQL : Filter with Dynamic Comparison Operator (=, <=, >=, ...),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17821231/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com