在T-SQL中使用Like()的复杂查询过滤器

时间:2011-04-09 21:37:36

标签: sql sql-server tsql

我正在编写一个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提供了强大的功能。我应该使用一些不同的查询表达式吗?

2 个答案:

答案 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值,来自逗号分隔值,来自临时表或其他任何内容。