【发布时间】:2018-11-09 07:49:03
【问题描述】:
我在 SQL Server 中有一个脏话表,我使用 LIKE 查询在文本中搜索表中的单词。我需要一种方法来在 LIKE 查询中包含脏话周围的空格,如下所示:
... LIKE '%{whitespace}SWEAR-WORD{whitespace}%';
在脏话周围留出空格是不够的,因为它可以是我的语言中另一个正常单词的一部分(例如“inter”,它是“international”或“pointer”的一部分)。
我尝试过的另一个解决方案是使用这个:
... LIKE '%[^a-zA-Z]SWEAR-WORD[^a-zA-Z]%';
但这对我不起作用。
有没有办法做到这一点?或者,除了 LIKE 查询之外还有其他解决方案吗?
编辑:为了更好地理解,这是我们目前查找脏话的方式:
我们有一个名为 Reviles 的表,它有 2 列(Id 和 Text)并包含受限制的单词和短语。我们使用此查询来查明内容是否包含任何受限制的字词和短语:
IF EXISTS (SELECT * dbo.Reviles WHERE @Text LIKE '%' + dbo.Reviles.Text + '%')
@IsHidden = 0
请注意,此检查是在将内容插入其表之前完成的。上面的代码是存储过程的一部分,它获取帖子的信息并在插入之前检查各种内容,包括脏话。
在我们在表格中存储诸如“swear-word”之类的受限词之前,但是通过这种方式,我们无法找到并隐藏在行首或行尾带有脏话的内容或仅由 a 组成的内容脏话。例如:
This is my content with a swear-word
或者
Swear-word in my content
或者
Swear-word
因此,我们决定删除这些空格并存储诸如“swear-word”之类的受限词。但这会导致一些正常的内容被隐藏,因为一些脏话可能是另一个正常词的一部分(如果我们假设 inter 是一个坏词,那么指针和国际等将被限制)。
对不起,我的英语不好,我希望通过这个描述,我已经说清楚了。
【问题讨论】:
-
如果我理解正确,你只是想在脏话前后留一个空格?您不想完全删除脏话吗?
-
你总是有相同数量的空格吗?
-
这很难做到。因为找不到后跟标点符号的脏话,但是正如您所注意到的,有许多单词(特别是名称)包含这样的单词(“斯肯索普问题”)。我怀疑
LIKE表达式的有限功能以及 Unicode 的表现力意味着这在纯 SQL 中是不可解决的。 -
@TheSETJ 试试
LIKE '%[^a-z]swear-word[^a-z]%' -
SQL Server 提供full-text search for this。使用
LIKE无法有效地查找单词,因为它无法利用索引
标签: sql-server tsql whitespace sql-like