2017-04-25 9 views
0

検索SQLクエリを作成して、ユーザーが入力する文字列を含む名前を探したいとします。それは以下のような質問ですが、私は 'どこ'の部分を作るか分かりません。私はGoogleで探しているが、私はまだ正しいものを見つけることができません。SQL Serverで文字列の各単語を含む検索クエリを作成するにはどうすればよいですか?

DECLARE @string varchar(20) 
SELECT @string = 'test complete name' 
SELECT complete_name from users 
    where complete_name like '%test%' 
    or complete_name like '%complete%' 
    or complete_name like '%name%' 
    or complete_name like '%test complete%' 
    or complete_name like '%test name%' 
    or complete_name like '%complete name%' 
    or complete_name like '%test complete name%' 

答えて

0

文字列を単語の一時表に分割する機能を作成することができます。クエリで使用します。

あなたは T-SQL split string

DECLARE @string varchar(20) 
SELECT @string = 'test complete name' 
SELECT complete_name from users 
    where complete_name in (dbo.splitstring(@string)) 

は二つ

の世話をするのリンクをたどることができます関数を作成するには

1)参考リンクは、クエリ内のスペース

2)になる必要があります。カンマ区切り文字を使用しています正確な検索を行います。あなたは同様のクエリのためにいくつかのロジックを書く必要があります。例えば作成した関数にカラム値 "complete_name"を渡します。関数内の比較のように使用して、だから、1または0を返し、

以下DECLARE @string varchar(20) SELECT @string = 'test complete name' SELECT complete_name from users where 1 = dbo.test_complete_name(@string,complete_name)

0

は、追加機能の任意のハードコーディングや作成を必要としないであろう方法であるなります場所。私は理解を容易にするために、別の手順で説明しようとしました。

DECLARE @string varchar(20) ,@stringxml xml,@rowvalue varchar(20) 
SELECT @string = 'test complete name' 
--Convert the string to an xml 
    Select @stringxml=CAST(('<a>'+replace(@string,' ','</a><a>')+'</a>')as xml) 

--Split the xml to rows based on each word.i.e. each word to one row using nodes() 
select Row_values.value('.' ,'varchar(max)') 
AS StringValues 
FROM 
@stringxml.nodes('/a') As StrXml(Row_values) 

上記のクエリは、各単語を持つ行を含む表を返します。この表は、必要な検索を行うために表に結合できます。

以下のクエリは、最終的な答え

DECLARE @string varchar(20) ,@stringxml xml,@rowvalue varchar(20) 
SELECT @string = 'test complete name' 

--convert string to xml 
Select @stringxml=CAST(('<a>'+replace(@string,' ','</a><a>')+'</a>')as xml) 

--Inner join your table to the value from nodes 
Select DISTINCT Urtbl.[ColName] from [YourTableName] Urtbl inner join(
select Row_values.value('.' ,'varchar(max)') 
AS StringValues 
FROM 
@stringxml.nodes('/a') As StrXml(Row_values)) newtbl 
on Urtbl.[ColName] like '%'+newtbl.StringValues+'%' 
0

それは与えられた文字列を分割し、与えられた入力から個々の単語を返す以下のような関数を作成して必要なものである

Create function fn_stringSplit(@StringSplit varchar(max)) 
returns @table table(SplitValue varchar(10) not null) 
as 
begin 
    Declare @StartVal int 
    Declare @endVal int 
    set @StringSplit = @StringSplit + ' ' 
    set @StartVal = 1 
    set @endVal = 1 
    while @endVal >= 0 
     begin 
      set @endVal = charindex(' ',@StringSplit,@StartVal); 
      insert into @table select SUBSTRING(@StringSplit,@StartVal,@endVal-1) 
      set @StringSplit= SUBSTRING(@StringSplit,@endVal+1, LEN(@StringSplit)) 
      if @StringSplit = '' set @endVal= -1 
     end 
    return 
end 

入力を渡してメインクエリの関数を呼び出す

DECLARE @string varchar(20) 
SELECT @string = 'Marketing tool designer' 
SELECT JobTitle from Employee e 
    where JobTitle in (select e.JobTitle from fn_stringSplit(@string) ss 
          where e.JobTitle like '%'+SplitValue+'%') --Here Splitvalue is the column name in the table that is returned by fn_stringSplitfunction 
我々は

DECLARE @string varchar(20) 
SELECT @string = 'Marketing tool designer' 
SELECT JobTitle from Employee e 
    where JobTitle in (select e.JobTitle from String_Split(@string) ss 
          where e.JobTitle like '%'+Value+'%') --Here **value** is the column name in the table that is returned by **String_Split** 
としてクエリを書くことができ、機能String_Splitを持っているのSQL Server 2016で

関連する問題