【问题标题】:SQL - Including whitespace in LIKE query for filtering content include swear wordsSQL - 在 LIKE 查询中包含空格以过滤内容,包括脏话
【发布时间】: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


【解决方案1】:

尝试用一些字符关闭你的检查语句,然后比较:

一些数据:

declare @T table(stmt nvarchar(20))
insert into @T values ('inter'),('Inter.'),('My inter'),
('intermediate!'),('pointer '),('Good inter'),('inter inter inter')

试试这个:

select
    stmt as stmt,
    case
        when '.'+stmt+'.' like '%[^a-z]inter[^a-Z]%' then 1 else 0 end as [has inter]
from
    @T

结果:

stmt                 has inter
-------------------- -----------
inter                1
Inter.               1
My inter             1
intermediate!        0
pointer              0
Good inter           1
inter inter inter    1

【讨论】:

  • 添加这些点很聪明。我做了一个快速测试,它工作正常。但是,我需要进一步测试它。如果它通过所有测试,我会将您的帖子标记为答案。
【解决方案2】:

我有点困惑你想做什么,如果你想做像'{whitespace}swearword{whitespace}',那么使用like '% inter %'已经工作了

但如果你真的对过滤器有特殊要求,另一种方法是启用 SQL CLR,并从 VisualStudio 创建 Sql 函数并部署到 SQL Server。在 SQL 函数中,你可以使用正则表达式来返回匹配与否。

  1. 创建 SQL 数据库项目
  2. 添加 SQL CLR(我使用 C#)
  3. 添加代码

    public partial class UserDefinedFunctions
    {
      [Microsoft.SqlServer.Server.SqlFunction]
      public static SqlBoolean RegularMatch(string str, string pattern)
      {
        var regex = new Regex(pattern);
        return new SqlBoolean (regex.IsMatch(str));
      }
    }
    
  4. 对 SQL Server 公开

对不起,我不擅长格式化。

【讨论】:

  • 我们之前有 '% swear-word %'。问题是,如果脏话显示为单个单词或出现在行首或行尾,则此模式无法找到。
  • @TheSETJ 然后你可以试试这个 CLR 常规解决方案。
  • 我可以远程访问数据库,但无法部署任何东西(或者至少不知道如何部署)。但我感谢你的帮助。顺便说一句,为了扩展我的知识,我有兴趣了解更多。您能否给我任何视频链接,包括此方法的示例或任何深入解释它的内容(我的意思是使用 CLR 和 SQL Server 数据库)?
猜你喜欢
  • 1970-01-01
  • 2012-12-29
  • 2011-04-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-14
相关资源
最近更新 更多