下面是一个返回的数据示例。
ID | 2 | 3 | 4 | 5 |
---|
假设你只是不想让句子包含被审查的单词,但忽略包含它的单词。
然后这将适用于大多数SQL方言
但它并不完美
F.e.找不到anus!
select *
from test
where concat(' ',description_snippet,' ') not like
concat('% ',censored_word,' %')
一些RDBMS具有接受正则表达式的函数。这提供了更多的灵活性
F.例如单词边界的使用。
下面是一个在Postgresql中工作的例子
测试
create table test ( ID serial primary key, censored_word varchar(30), description_snippet varchar(30) ); insert into test (id, censored_word, description_snippet) values (1, 'anus', 'anus') , (2, 'anus', 'manuscript submitted') , (3, 'anus', 'tetanus vaccination') , (4, 'anus', 'oceanus proposal') , (5, 'rere', 'prerequisite includes') , (6, 'rere', 'no rere without anus')
select * from test where description_snippet !~ concat('m(', censored_word, ')M')
id | revisted_word | ||
---|---|---|---|
2 | 肛门 | td style="text-align:right;">3肛门 | 破伤风疫苗接种 |
4 | 肛门 | td style="text align=right;">5重新阅读 | 先决条件包括 |
您可以使用regexp来搜索description_snippets,这些description_snippets在reviered_word之前或之后至少有一个字母。
select * from test where lower(description_snippet) regexp lower(concat("[[:alpha:]]",censored_word,"|",censored_word,"[[:alpha:]]"));
或者像一样使用
select * from test where lower(description_snippet) like (concat('%',lower(censored_word))) or lower(description_snippet) like(concat(lower(censored_word),"%"));
http://sqlfiddle.com/#!9/a471f3/7