2009-05-09 4 views
0

ほとんどのユーザ入力単語を含むdbレコードに一致するクエリをt-sqlまたはlinqに書く必要があります。SQLで一致する最も近い句

exmaple:デシベルで のnvarcharフィールド:「速い茶色のキツネは、のろまなイヌに飛びかかった」

ユーザ入力:「茶色の牛」

それは言葉茶色を持っているので、プログラムがそのレコードと一致します。

私はもっと例を挙げる必要があるかどうか教えてください。

+0

ユーザーワードを含むレコード、または最も多くのレコードを含むレコードが必要ですか? – TStamper

答えて

1

一般に、UDFを使用して文字列を表形式のデータに分割し、同様のコマンドを使用できます。

declare @searchStr nvarchar(100) 
set @searchStr = 'brown fox' 
selecT T.* from test T, dbo.fnc_SplitSTring(@searchStr,' ') 
where T.name like '%' + token + '%' 


CREATE FUNCTION [dbo].[fnc_SplitString] 
(
@InString varchar(8000), 
@Delim char(1) 
) 
RETURNS @Return table 
(
Position int identity, 
Token varchar(100) -- Maximum token size is 100 chars... 
) 
As 
BEGIN 
    Declare @CR varchar(1), 
    @LF varchar(1) 
    Set @CR = char(10) 
    Set @LF = char(13) 
    -- 
    If @InString is null return 
    -- 
    Declare @Pos int 
    Declare @Pattern char(3) 
    Set @Pattern = '%' + @Delim + '%' 
    -- 
    Declare @Token varchar(30) 
    SELECT @InString = @InString + @Delim -- add trailing delimiter 
    SELECT @Pos = PATINDEX(@Pattern, @InString) 
    WHILE (@Pos <> 0) BEGIN 
     SELECT @Token = ltrim(rtrim(SUBSTRING(@InString, 1, @Pos - 1))) 
     Select @Token = replace(@Token, @CR, '') 
     Select @Token = replace(@Token, @LF, '') 
     Insert @Return Values (@Token) 
     SELECT @InString = STUFF(@InString, 1, PATINDEX(@Pattern, @InString),'') 
     SELECT @Pos = PATINDEX(@Pattern, @InString) 
    END 
-- 
return 
-- 
END 
2

あなたは、あなたがFull Text Search技術を使用する必要があり、MS SQL Server環境でT-SQLを使用していると仮定。それはあなたにスピードを与え、車輪の再発明からあなたを遠ざけます。

+0

linq経由でアクセスできますか? –

+0

正式には、まだです。ストアドプロシージャを呼び出すLINQを使用するか、カスタムソリューションのためにこのリンクをチェックしてくださいhttp://sqlblogcasts.com/blogs/simons/archive/2008/12/18/LINQ-to-SQL---Enabling-Fulltext-searching。 aspx – tofi9

関連する問題