我正在编写一个SQL脚本,希望我们的会计团队能够编辑,而无需处理工程。
一般的想法是有一个.sql脚本,它在查询的顶部定义了一些变量,然后在它下面有几个使用这些变量的复杂查询。
我们遇到的问题是我们希望会计团队能够指定要使用的过滤器。例如:
DECLARE @year INT
DECLARE @month INT
DECLARE @filter VARCHAR(30);
SET @year = 2010
SET @month = 7
SET @filter = '%test%'
此处团队可以更改后续查询返回的月份和年份。他们还可以定义一个过滤器元素,在本例中,不包括用户名中包含字符串'test'
的任何记录。
我的问题是,是否有办法为LIKE()
指定OR。例如,理想情况下,我们将@filter
变量设为'%test%
或%other%
。现在我知道这不是真正的语法,但我想知道是否有语法可以让我实现这一点。我已经在LIKE()
语法上为MSDN提供了强大的功能。我应该使用一些不同的查询表达式吗?
答案 0 :(得分:1)
可能最简单的事情就是拥有多个参数,尽管它并不漂亮:
SET @filter_1 = '%test%'
SET @filter_2 = '%foo%'
SET @filter_3 = '%'
SET @filter_4 = '%'
SELECT *
FROM BAR
WHERE var LIKE @filter_1
OR var LIKE @filter_2
OR var LIKE @filter_3
OR var LIKE @filter_4
OR var LIKE @filter_5
将它们默认为%,默认情况下它们始终匹配。
您还可以使用动态SQL和本地表变量。基本上,创建一个包含一列的本地表,允许它们将INSERT语句更改为该表,然后定义一个循环,该循环遍历该表的内容以动态生成LIKE子句。它会工作,但它会有更多的代码。上面的例子很快而且很脏,但我猜它可能足以满足你的需要。
答案 1 :(得分:1)
我使用LIKE
谓词的联接。您可以在查询窗口中执行以下代码示例,以查看其工作原理:
DECLARE @tblFilter TABLE
(sFilter nvarchar(MAX) NOT NULL);
INSERT @tblFilter
SELECT * FROM (VALUES ('%one%'), ('%two%'), ('%three%')) v(s);
DECLARE @tblData TABLE
(iId int NOT NULL PRIMARY KEY IDENTITY,
sData nvarchar(MAX));
INSERT @tblData(sData)
SELECT * FROM (VALUES ('one'), ('two three'), ('four')) v(s);
SELECT DISTINCT iId
FROM @tblData d
JOIN @tblFilter f ON d.sData LIKE f.sFilter;
我假设不同的查询字符串位于@tblFilter
表中,该表可以是TVP,来自XML值,来自逗号分隔值,来自临时表或其他任何内容。