T-SQL查找部分出现在段落

时间:2017-05-10 10:56:47

标签: sql-server full-text-search string-matching

假设有两个表,如:

表1:

ID ___内容

11 ___ Apple iPhone是一款出色的电子设备。

12 ___三星galaxy提供了良好的功能。

表2:

ID ___ Title

71 ___翻新诺基亚3310

72 ___全新iPhone 6

73 ___阿尔卡特T-Phone

我想创建一个从Table1(例如11)接收ID的查询,并从Table2返回包含来自Table1的内容列中的字词的记录(此处为:72)。

我启用了全文,虽然找不到有效且快捷的方法来创建查询,但是甚至没有找到启动的线索。我一直在避免通过WHILE将句子解析为单词或者将它们拆分,我认为必须有正确的方法来处理它。

感谢您的帮助,如果需要进一步说明,请与我们联系。

1 个答案:

答案 0 :(得分:1)

我找到了解决方案。它可能不是最快或最干净的,但看起来很有效。我决定使用' ' (空格)作为单词分割器。

首先,我们需要创建将文本拆分为单词的拆分函数:

CREATE FUNCTION [dbo].[f_SplitVarchar]
    (
      @RowData NVARCHAR(MAX) ,
      @SplitOn NVARCHAR(5)
    )
RETURNS @ReturnValue TABLE ( Data NVARCHAR(MAX) )
AS 
    BEGIN
        DECLARE @Counter INT
        SET @Counter = 1 
        WHILE ( CHARINDEX(@SplitOn, @RowData) > 0 ) 
            BEGIN  
                INSERT  INTO @ReturnValue
                        ( data
                        )
                        SELECT  Data = LTRIM(RTRIM(SUBSTRING(@RowData, 1,
                                                             CHARINDEX(@SplitOn,
                                                              @RowData) - 1)))
                SET @RowData = SUBSTRING(@RowData,
                                     CHARINDEX(@SplitOn, @RowData) + 1,
                                     LEN(@RowData)) 
            SET @Counter = @Counter + 1  
        END 
    INSERT  INTO @ReturnValue
            ( data )
            SELECT  Data = LTRIM(RTRIM(@RowData))  
    RETURN  
END;

然后用它来获取我们的数据:

CREATE PROCEDURE prc

AS
BEGIN

    SET NOCOUNT ON;
    declare @TEMP table (IDTable1 int, IDTable2 int)


        DECLARE @etd TABLE
        (
          words nvarchar(max) 
        )


        declare @idtable1 int, @Content nvarchar(max), @word nvarchar(max)

        declare k cursor local forward_only for select [ID]
      ,[Content] from Table1

      OPEN k;
FETCH NEXT FROM k INTO @idtable1 , @Content
WHILE @@FETCH_STATUS=0
    BEGIN


        delete from @etd

        insert into @etd (words)
        select * from  dbo.f_SplitVarchar(@Content,' ')

        declare k1 cursor local forward_only for select words from @etd

          OPEN k1;
    FETCH NEXT FROM k1 INTO @word
    WHILE @@FETCH_STATUS=0
        BEGIN


        insert into @TEMP select @idtable1, ID from Table2 where ' ' + title + ' ' like '% ' + @word + ' %'


        FETCH NEXT FROM k1 INTO @word
        END

        close k1
        deallocate k1



        FETCH NEXT FROM k INTO @idtable1 , @Content
        END

        close k
        deallocate k
    select * from @TEMP
END
GO

最后,只需Exec prc从Table1中选择ID,表2中的ID包含第一个表中的单词。如果您需要更多帮助或者您不了解任何事情,请询问=)。