SQL Query执行反向CONTAINS搜索?

时间:2014-09-24 22:36:45

标签: sql regex

我需要搜索文章标记字符串,这些字符串是用户输入字符串的子字符串。

因此,在下面的示例中,如果用户搜索" normal",则查询应返回第1条和第3条,因为第3条具有通配符标记" norm *" 。 如果我搜索"标准化"然后我应该回到第3和第4条。 如果我需要更清楚地解释我的问题,请告诉我。

实施例 -

  • 第1条标签=正常
  • 第2条标签=苹果
  • 第3条标签=标准*
  • 第4条标签=正常化
  • 第5条Tag = corvette

注意 - 我只需要对以*

结尾的标签进行子字符串搜索

3 个答案:

答案 0 :(得分:5)

最简单的方法,但可能不是最有效的方法,就是在表格中用*替换所有%并使用LIKE语句:

SELECT
  Tag
FROM
  Article
WHERE
  'normal' LIKE REPLACE(Tag, '*', '%')

查看SqlFiddle

中的示例

答案 1 :(得分:2)

我认为这个查询应该有效,尽管我没有测试它超出你的样本数据。

此外,您没有指定您正在使用的数据库,我只是在MS SQL上尝试过它,但它应该很容易适应其他数据库,因为它只依赖于charindex和left(或substring)和那些函数应该可以在大多数数据库中使用。

SQL Fiddle

MS SQL Server 2008架构设置

create table your_table (article varchar(10), tag varchar (20))
insert your_table values 
('Article 1','normal'),
('Article 2','apple'),
('Article 3','norm*'),
('Article 4','normalization'),
('Article 5','corvette')

查询1

declare @str varchar(30) = 'normalization'

select t.article, tag 
from your_table t
left join (
    select 
       article, 
       left(tag, charindex('*', tag,0)-1) t, 
       charindex('*', tag,0)-1 as l 
    from your_table 
    where charindex('*', tag,0) > 0
    ) a
on t.article = a.article
where (tag = @str) or (left(@str, l) = t)

<强> Results

|   ARTICLE |           TAG |
|-----------|---------------|
| Article 3 |         norm* |
| Article 4 | normalization |

查询2

declare @str varchar(30) = 'normal'

select t.article, tag 
from your_table t
left join (
    select 
       article, 
       left(tag, charindex('*', tag,0)-1) t, 
       charindex('*', tag,0)-1 as l 
    from your_table 
    where charindex('*', tag,0) > 0
    ) a
on t.article = a.article
where (tag = @str) or (left(@str, l) = t)

<强> Results

|   ARTICLE |    TAG |
|-----------|--------|
| Article 1 | normal |
| Article 3 |  norm* |

答案 2 :(得分:0)

如果您使用SQL Server,那么您可以这样做: 我的意思是 如果以*结尾,则检查子串是否存在, 否则直接匹配

    SELECT * FROM Articles
    WHERE
    CASE WHEN RIGHT(Articles.Tag, 1) = '*'
        CHARINDEX(LEFT(Articles.Tag, LEN(Articles.Tag) - 1), GivenStr)
    ELSE
        Articles.Tag=GivenStr