SQL-запрос для возврата, содержат ли две строки общий термин - PullRequest
4 голосов
/ 26 апреля 2011

Есть ли простой способ проверить в запросе SQL, имеют ли два строковых значения из разных столбцов общий термин?

Например:

Str1 = "little brown fox" Str2 = "big brown bear" Return_Value = 1
Str1 = "Sun is shinning" Str2 = "Its raining" Return_Value = 0

Ответы [ 3 ]

3 голосов
/ 26 апреля 2011

Возможно, вам придется внести некоторые изменения в строки, которые вы сравниваете, но я бы порекомендовал взглянуть на функцию CONTAINS

Пример:

WHERE
CONTAINS('little brown fox', 'big OR brown OR bear') OR 
CONTAINS('Sun is shinning', 'Its OR raining')

Подробнее о CONTAINS можно прочитать здесь:

http://msdn.microsoft.com/en-us/library/ms187787.aspx

1 голос
/ 26 апреля 2011

Вы не указали свою СУБД, но с PostgreSQL это выглядело бы примерно так:

select count(*) from (
  select unnest(string_to_array('little brown fox', ' '))
  intersect
  select unnest(string_to_array('big brown bear', ' '))
)  t

вернет количество слов, которые соответствуют обеим строкам (поэтому 1 для приведенного выше примера и 0 длятвой второй пример)

0 голосов
/ 26 апреля 2011

Вероятно, это не лучшая пользовательская функция, но она может помочь вам найти путь к тому, что вам нужно.

CREATE FUNCTION [dbo].[ContainsSharedTerm]
( @SearchString1 varchar(255), @SearchString2 varchar(255) )
RETURNS BIT
AS
BEGIN
    DECLARE @MatchFound BIT
    SET @MatchFound = 0
    DECLARE @TempString VARCHAR(255)

    WHILE LEN(@SearchString1) > 0 AND @MatchFound = 0
    BEGIN
        IF CHARINDEX(' ',@SearchString1) = 0
        BEGIN
            SET @TempString = @SearchString1
            SET @SearchString1 = ''
        END
        ELSE
        BEGIN
            SET @TempString = LEFT(@SearchString1,CHARINDEX(' ',@SearchString1)-1)
            SET @SearchString1 = RIGHT(@SearchString1,LEN(@SearchString1)-CHARINDEX(' ',@SearchString1))
        END

        IF CHARINDEX(@TempString,@SearchString2) > 0
        BEGIN
            SET @MatchFound = 1
        END
    END
    RETURN @MatchFound
END

CREATE TABLE #TestTable (
    Col1 VARCHAR(100),
    Col2 VARCHAR(100)
)

INSERT INTO [#TestTable] ([Col1],[Col2]) VALUES ('little brown fox','big brown bear')
INSERT INTO [#TestTable] ([Col1],[Col2]) VALUES ('Sun is shinning','Its raining')

SELECT [Col1],[Col2],dbo.[ContainsSharedTerm]([Col1],[Col2]) AS [Match]
FROM [#TestTable]

DROP TABLE [#TestTable]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...