我需要搜索文章标记字符串,这些字符串是用户输入字符串的子字符串。
因此,在下面的示例中,如果用户搜索" normal",则查询应返回第1条和第3条,因为第3条具有通配符标记" norm *" 。 如果我搜索"标准化"然后我应该回到第3和第4条。 如果我需要更清楚地解释我的问题,请告诉我。
实施例 -
注意 - 我只需要对以*
结尾的标签进行子字符串搜索答案 0 :(得分:5)
最简单的方法,但可能不是最有效的方法,就是在表格中用*
替换所有%
并使用LIKE
语句:
SELECT
Tag
FROM
Article
WHERE
'normal' LIKE REPLACE(Tag, '*', '%')
中的示例
答案 1 :(得分:2)
我认为这个查询应该有效,尽管我没有测试它超出你的样本数据。
此外,您没有指定您正在使用的数据库,我只是在MS SQL上尝试过它,但它应该很容易适应其他数据库,因为它只依赖于charindex和left(或substring)和那些函数应该可以在大多数数据库中使用。
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