することで、検索し、詳細にすべてのフィールドを持っていない一つの選択肢であり、それはすべてのヒットレコードのみが返されます、
ここでは、私の解析機能を使用しましたが、インラインクエリに簡単に変換できます。
例
Declare @YourTable Table ([first_name] varchar(50),[last_name] varchar(50),[age] int,[height] int,[mother_name] varchar(50))
Insert Into @YourTable Values
('mary','jones',19,170,'sally jane')
,('john','doe',43,165,'sarah connor')
,('john','connor',17,173,'sarah connor')
,('joe','bloe',32,173,'sarah connor')
,('john','connor',32,165,'sarah connor')
Declare @Search varchar(max) = 'jo% %connor%'
;with cte as (
Select *,MaxHit=max(RetSeq) over() From [dbo].[udf-Str-Parse](@Search,' ')
)
Select A.*
From @YourTable A
Cross Apply (Select XMLData=convert(xml,(Select A.* For XML RAW))) B
Cross Apply (
Select Hits=count(*)
From (
Select Value = attr.value('.','varchar(max)')
From B.XMLData.nodes('/row') as A(r)
Cross Apply A.r.nodes('./@*') AS B(attr)
) C1
Join cte C2 on patindex(C2.RetVal,Value)>0
Having count(Distinct C2.RetSeq)>=max(C2.MaxHit)
) C
戻り
first_name last_name age height mother_name
john doe 43 165 sarah connor
john connor 17 173 sarah connor
joe bloe 32 173 sarah connor
john connor 32 165 sarah connor
parse関数興味
CREATE FUNCTION [dbo].[udf-Str-Parse] (@String varchar(max),@Delimiter varchar(10))
Returns Table
As
Return (
Select RetSeq = Row_Number() over (Order By (Select null))
,RetVal = LTrim(RTrim(B.i.value('(./text())[1]', 'varchar(max)')))
From (Select x = Cast('<x>' + replace((Select replace(@String,@Delimiter,'§§Split§§') as [*] For XML Path('')),'§§Split§§','</x><x>')+'</x>' as xml).query('.')) as A
Cross Apply x.nodes('x') AS B(i)
);
--Thanks Shnugo for making this XML safe
--Select * from [dbo].[udf-Str-Parse]('Dog,Cat,House,Car',',')
--Select * from [dbo].[udf-Str-Parse]('John Cappelletti was here',' ')
--Select * from [dbo].[udf-Str-Parse]('this,is,<test>,for,< & >',',')
01の場合
EDIT - XMLなしオプション - (XMLよりもはるかにperforant)
Declare @Search varchar(max) = 'jo% %connor%'
;with cte as (
Select *,MaxHit=max(RetSeq) over() From [dbo].[udf-Str-Parse](@Search,' ')
)
Select A.*,C.*
From #Temp A
Cross Apply (
Select Hits=count(Distinct C2.RetSeq)
From (values (A.[first_name])
,(A.[last_name])
,(concat('',A.[age]))
,(concat('',A.[height]))
,(A.[mother_name])
) C1 (Value)
Join cte C2 on patindex(C2.RetVal,Value)>0
Having count(Distinct C2.RetSeq)>=max(C2.MaxHit)
) C
注:は、私は[SPACE]に戻って区切りを置くが、これは%サラ・コナー」のような検索を妨げます% '。個人的に、私はPIPEのようなトークンを好むが、それは選択肢である。さらに、日付、または/および/または数値を検索することができます。
first_nameが 'mary'でlast_nameが 'joconnor'の場合はどうなりますか?それは一致ですか? 'jo%'と '%connor%'を検証しますが、それは同じ列です。 – Horaciux
番号。スペースは単語 – Asagohan
を区切りますが、それはワイルドカード検索でなければなりませんか?あなたが有限数の列を持っているならば、ORを行うことができます。 – maSTAShuFu