2017-07-06 55 views
-1

我有一個表稱爲關鍵字100個關鍵字範圍從一個字到幾個,全部用逗號分隔。例如:如何部分匹配字符串中的單詞 - TSQL

change of name, asb, repair, reporting violence 

這些關鍵字被分爲幾類。

我們有可以在任意文本字段中輸入任何文本的用戶。示例:

Caller rang to to speak to ASB about violence 

如何使用SQL讀取自由文本字段中的單詞以檢查關鍵字表中的任何匹配項?所以在上面的例子中,我希望它能夠發現ASB和Violence存儲在關鍵字表中。

我還希望它帶回的結果,如果只有一個字像ASB一樣使用。

請務必注意,任何單詞都可以輸入到自由文本字段中。

我正在使用Microsoft SQL Server 2014 SP2。

謝謝

+0

您使用的是什麼版本的SQL服務器? – w0051977

+0

嗨,Microsoft SQL Server 2014 SP2 – user114790

+0

我會使用全文目錄並閱讀更多。 MS建議您在開始搜索大量文本時以這種方式進行搜索。如果你只是做了幾件事情和一個小型數據庫,它可能是好的。但最終,如果它是一個應用程序的全功能核心部分,它是一個更全面的功能集這種類型的操作。你也可以做類似的搜索,比如bike = bicycle,反之亦然。 https://blog.sqlauthority.com/2008/09/05/sql-server-creating-full-text-catalog-and-index/ – djangojazz

回答

0

由於您還沒有指定您的表名;我會創造一些。請運行以下命令:

create table dbWords (id int not null identity, words varchar(100), primary key (id)) 
insert into dbWords (words) values ('change of name, asb, repair, reporting violence') 

CREATE FUNCTION [dbo].[fnSplitString] 
( 
    @string NVARCHAR(MAX), 
    @delimiter CHAR(1) 
) 
RETURNS @output TABLE(splitdata NVARCHAR(MAX) 
) 
BEGIN 
    DECLARE @start INT, @end INT 
    SELECT @start = 1, @end = CHARINDEX(@delimiter, @string) 
    WHILE @start < LEN(@string) + 1 BEGIN 
     IF @end = 0 
      SET @end = LEN(@string) + 1 

     INSERT INTO @output (splitdata) 
     VALUES(SUBSTRING(@string, @start, @end - @start)) 
     SET @start = @end + 1 
     SET @end = CHARINDEX(@delimiter, @string, @start) 

    END 
    RETURN 
ENd 

然後運行這個命令:

select * from dbWords inner join (
select * from dbo.fnSplitString('change of name, change of dob', ',') 
) as splitdatatable on dbwords.words like '%,' + splitdata+ ',%' 
or dbwords.words like '%,' + splitdata 
or dbwords.words like splitdata + ',%' 

傳遞到上面的SQL語句的功能的文本是由用戶輸入的文本。

+0

嗨,我有Microsoft SQL Server 2014 SP2。參考結構 - 我正在從一個表和一列返回多行的數據。每行都有一個由逗號分隔的關鍵字列表 – user114790

+0

@ user114790,請發佈您的表結構 – w0051977

+0

@ user114790,我現在編輯了我的答案我知道您正在使用SQL Server 2014。 – w0051977