SQL - включение пробела в запрос LIKE для фильтрации содержимого, включая нецензурные слова - PullRequest
0 голосов
/ 09 ноября 2018

У меня есть таблица нецензурных слов в 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

Обратите внимание, что эта проверка выполняется до того, как контент будет вставлен в его таблицу.Приведенный выше код является частью хранимой процедуры, которая получает информацию о сообщении и проверяет различные вещи, включая нецензурные слова, перед тем, как вставить их.

Прежде чем мы сохранили в таблице запрещенные слова, такие как «ругательство», однакотаким образом, мы не могли найти и скрыть содержимое с нецензурными словами в начале или в конце строки или содержимое, состоящее только из нецензурных слов.Например: This is my content with a swear-word или Swear-word in my content или Swear-word Поэтому мы решили удалить эти пробелы и сохранить запрещенные слова, такие как «ругательство».Но это приводит к тому, что некоторое нормальное содержимое скрывается, потому что некоторые нецензурные слова могут быть частью другого слова, которое является нормальным (если мы предположим, что inter - это плохое слово, указатель и международный и т. Д. Будут ограничены).

Извинитедля моего плохого английского, я надеюсь, с этим описанием, я дал понять.

Ответы [ 2 ]

0 голосов
/ 09 ноября 2018

попробуйте закрыть свой чек в некоторых символах, а затем сравнить:

некоторые данные:

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
0 голосов
/ 09 ноября 2018

Я немного запутался, что вы хотите сделать, если вы хотите сделать как '{whitespace} swearword {whitespace}', тогда используйте like '% inter %' уже работает

но если у вас действительно есть особые требования к фильтру, другой способ - включить SQL CLR и создать функцию Sql из visualStudio и развернуть ее на 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

Извините, я плохо разбираюсь в этом.

...