2011-10-05 11 views
1

標準のTSQLを使用して1つのSQLローに異なるバリエーションの入力をどのようにマッチさせるかを調べたいと思います。私は、SQLの行に次のテキストを持っている複数の入力のバリエーションを1つのSQLローに一致させる

:ここでシナリオがあるI love

私は、この行に一致するものを返す必要がありますすべては、次の3入力を備えています:

"私はLO に完全にM」私達にあなたのすべての StackOverflowの "

" を伝えたい

StackOverflowので VEのI本当に StackOverflowの』

あなたは私がしようとすると、彼らは一致し、なぜあなたにそれをより明確にするために、一致した理由を太字にしている見ることができるように。 II'mも故意にマッチしていますので、マッチでそれを含めることができれば良いでしょう。

私は、次のTSQLを使用して行われた入力文字列を分割について考えた:

-- Create a space delimited string for testing 
declare @str varchar(max) 
select @str = 'I want to tell you we all love StackOverflow' 
-- XML tag the string by replacing spaces with </x><x> tags 
declare @xml xml 
select @xml = cast('<x><![CDATA['+ replace(@str,' ',']]></x><x><![CDATA[') + ']]></x>' as xml) 
-- Finally select values from nodes <x> and trim at the same time 
select ltrim(rtrim(mynode.value('.[1]', 'nvarchar(12)'))) as Code 
from (select @xml doc) xx 
cross apply doc.nodes('/x') (mynode) 

これは私に別の行としてすべての単語を取得しますが、その後、私はこれらを一致させるためのクエリを実行する方法を考え出すことができませんでした。

したがって、この時点からの任意のヘルプや、必要に応じて他の方法でマッチングすることは、非常に高く評価されます。

UPDATE:

@freefallerはRegexルートを私に指摘して、私はさらに前方にビットを取得することができた関数を作成、それゆえ1 @freefaller、しかし、私は今、どのように私ができる知っている必要があります

SELECT * FROM dbo.FindWordsInContext('i love','I want to tell you we all love StackOverflow',30) 
SELECT * FROM dbo.FindWordsInContext('i love','I''m totally in love with StackOverflow',30) 
SELECT * FROM dbo.FindWordsInContext('i love','I really love StackOverflow',30) 
上記

私にマッチした回数を返すとの関係:それはすべて私のテーブルの行ではなく、私は今、次のSELECT文を持っている「私は愛する」のハードコーディングされた入力を見てもらいます文字列が一致しているため、上記の最初の選択は返されます:

Hits Context 
1  ...I want to tell you we all love StackOv... 

この関数は、この関数ですべての行を検索し、一致する行/行を返す方法を教えていただけますか?

+0

「あなたはウィジェットを愛していますか?」 (単語の順序を逆にします) –

+0

残念ながら一致しない上記の関数を使用すると、これは信じられないほど複雑に思えます:-( – Apqu

+0

私の要件はどの順序であっても最良の結果が得られると思いますが、 *何か*働いています – Apqu

答えて

1

私はので、私は誰にも、同様の要件を有する場合には、私はここに投稿するだろうと思ったと思った自分の質問への答えを思い付くために管理しています未来。基本的には、SQL-CLR正規表現機能に依存し、パフォーマンスへの影響を最小限に抑えて実行されます。

まず、サーバー上のSQL-CLRを有効にした場合ではない(あなたがシステム管理者である必要が)すでに利用可能:

--Enables CLR Integration 
exec sp_configure 'clr enabled', 1 
GO 
RECONFIGURE 
GO 

次に、あなたは(あなたのパスを変更することを忘れてはいけないSQLでアセンブリを作成する必要がありますD:\SqlRegEx.dllからこのように設定SAFE許可を使用権限の最も制限で安全なセットですが、ここでは詳細には触れません):。

CREATE ASSEMBLY [SqlRegEx] FROM 'D:\SqlRegEx.dll' WITH PERMISSION_SET = SAFE 

今、あなたが呼び出す実際の関数を作成:

CREATE FUNCTION [dbo].[RegexMatch] 
(@Input NVARCHAR(MAX), @Pattern NVARCHAR(MAX), @IgnoreCase BIT) 
RETURNS BIT 
AS EXTERNAL NAME SqlRegEx.[SqlClrTools.SqlRegEx].RegExMatch 
最後に

と私たちは、その後、次のTSQL実行することができます自分の質問が完了と答える:

SELECT * 
FROM your_table 
WHERE dbo.RegexMatch(@search, REPLACE(your_field, ' ', '.*?'), 1) = 1 
SELECT * 
FROM your_table 
WHERE dbo.RegexMatch(@search, REPLACE(REVERSE(your_field), ' ', '.*?'), 1) = 1 

を私は、これは将来的には、単純な検索オプションがどうあるべきかの誰かを助けることを願っています。

1

1つのオプションは、SQLCLRオブジェクトas explained hereを介して正規表現を使用することです。

私は自分自身でSQLCLRオブジェクトを作成したことがないので、このメソッドの使いやすさについてはコメントできません。私は、しかし、正規表現の大ファンですとほとんどのテキスト検索/操作

編集のためのそれらの使用をお勧めします:コメントを受けて、私はSQLCLRの経験がないが、あなたが働いていることを取得すると仮定すると、何かを...次のような単純なテストされていない TSQLはうまくいくかもしれないよう

SELECT * 
FROM mytable 
WHERE dbo.RegexMatch(@search, REPLACE(myfield, ' ', '.*?')) = 1 
+0

その入力をありがとう、私は簡単な表情を見せてくれました。コミュニティは例を提供するために十分なregexとtsqlについて知っていますか? – Apqu

+0

@Aracas最終的なTSQL – freefaller

+0

のおかげで*可能な*例の私の編集を参照してください。残念ながら、いずれの文字列の結果も返されません。私は他の誰も知っていないのは驚いている、私はあなたの正規表現の推奨を実装することができるSQLについて知ってほしい – Apqu

関連する問題