SQL-在LIKE查询中包含空格以过滤内容,包括脏话

时间:2018-11-09 07:49:03

标签: sql-server tsql whitespace sql-like

我在SQL Server中有一个脏话表,并且使用LIKE查询在文本中搜索表中的词。我需要一种在LIKE查询中在誓词周围包含空格的方法,如下所示:

... LIKE '%{whitespace}SWEAR-WORD{whitespace}%';

在脏话周围加上空格是不够的,因为它可能是我语言中另一个普通单词的一部分(例如“国际”或“指针”的一部分)。

我尝试过的另一种解决方案是使用此方法:

... 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')存储在表中之前,但是通过这种方式,我们无法找到和隐藏行首或末尾带有咒骂词的内容或仅包含一个脏话。例如: This is my content with a swear-word 要么 Swear-word in my content 要么 Swear-word 因此,我们决定删除这些空格并存储受限制的单词,例如“ swear-word”。但这会隐藏一些正常的内容,因为某些脏话可能是另一个正常的词的一部分(如果我们假设inter是一个坏词,那么指针和国际字符等将受到限制。)

对不起,我的英语不好,我希望有了这个描述,我已经清楚了。

2 个答案:

答案 0 :(得分:1)

我有点困惑您想做什么,如果您想做'{whitespace} swearword {whitespace}'这样的事,那么请使用like '% inter %'已经有效

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

  1. 创建SQL Databaase项目
  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

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

答案 1 :(得分: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