2

SQLサーバーでクエリを作成する必要があります。このクエリは、2つの単語を含む行を選択し、その間に(少なくとも/最大​​で/正確に)指定された数の単語が含まれます...

私はその間に正確な数の単語を実装するためにこのコードを書きました:

SELECT simpledtext
FROM booktexts
WHERE simpledtext LIKE '%hello [^ ] [^ ] search%'

間に最小数の単語を実装するためのこのコード:

SELECT simpledtext
FROM booktexts
WHERE simpledtext LIKE '%hello [^ ] [^ ] % search%'

しかし、t-sqlコードの間に最大の単語を書く方法がわかりません...

もう1つの質問は、SQLServer2012で全文検索を使用してこれらの種類のクエリを実装できるかどうかです。

4

1 に答える 1

2

あなたの好きな文字列は、1文字の単語にのみ一致します。これが必要な場合は、次のようにまとめることができます。

declare @str1 varchar(1024) = 'and hello w w w search how are you',
        @str2 varchar(1024) = 'and hello w w search how are you',
        @likeStr varchar(512),
        @pos int,
        @maxMatch int;

set @maxMatch = 2;
set @pos = 0;

set @likeStr = '%hello';

while (@pos < @maxMatch)
begin
    set @likeStr += ' [^ ]';

    set @pos += 1;
end

set @likeStr += ' search%';

select @likeStr, (case when @str1 like @likeStr then 1 else 0 end), (case when @str2 like @likeStr then 1 else 0 end)

これが必要なものではなく、単語が何文字になるかがわかっている場合は[a-zA-Z]、ループ内の like 文字列で使用できます。

ただし、これもあなたが求めているものではないと思います。私の提案は、文字列のように放棄し、より洗練されたregular expressions.

残念ながら、System.dll を SQL Server 2008 に直接読み込むことはできません (これは SQL Server 2012 にも当てはまると思います)。そのため、カスタム .NET アセンブリを作成し、これをデータベースに読み込む必要があります。.NET コードで注釈を使用しIsDeterministic、カスタム アセンブリを SQL Server にロードする必要がありますwith permission_set = safe。これにより、関数の並列性が確保され、計算列などの場所で使用できるようになります。

SQL Server は .NET コードの実行に非常に優れています。つまり、パフォーマンスが非常に高くなります。必要なものを正規表現で書くのはとても簡単です。

全文検索に関しては、contains() は基本的に全文述語であり、使用するには SQL Server でこれを有効にする必要があります。near() は、contains() 述語内で使用されます。これは、サポートされている機能 (あいまい一致のために単語の語形変化を行う) と、それを使用するために有効にする必要があるもの (追加の Windows サービスを実行する) の両方の点で、あなたがやりたいことに対してかさばると思います。

于 2013-02-23T11:55:26.817 に答える