1

私はそれを行う方法がわからないことを達成しようとしています。ASP Classic と SQL 2008、IIS7 に基づく Web サイトに取り組んでいます。検索ページには、 のようなクエリごとにいくつかの値を設定するオプションがありますdefault.asp?q=one|two|three&q2=four|five|six
私がやろうとしているのは、クエリに値がない場合にワイルドカードを使用し、クエリにカップルの値がある場合に、1 つの列でカップルの単語を同時に検索できるようにすることです。これが私がやりたいことです:

  1. クエリに値がある場合は、データベースでうまくいきます(これは非常に簡単です)
  2. クエリに「|」で区切られたカップル値がある場合 署名してから分割し、それらすべてを検索します。
  3. クエリに値がまったくない場合は、ワイルドカードを使用し、何も検索しないでください。

これを達成するために、いくつかのことを試しましたが、成功しませんでした。これが私のコードの例です。

1 - - - - - -

@style nVarchar(150) = ''
Select * FROM mytable WHERE CONTAINS(style, @style) AND ...

CONTAINS から最良の結果を得るためにクエリを分割することはできますが'"* value1 *" OR "* value2 *"'、「スタイル」に値がある場合、これは機能します。スタイルに値がない場合、ワイルドカードがないため、データベースをフィルタリングせずにすべてのデータを取得できます。

二 - - - - - - - -

@style nVarchar(150) = ''
Select * FROM mytable WHERE style LIKE '%' + @style + '%' AND ...

LIKE 句を使用すると'%'、スタイルに値がない場合のようにワイルドカードを使用できますが、同じ列でカップルの値を検索することはできません。
したがって、これはちょっと複雑で、いくつかの場所で使用する必要があるため、「ストアド プロシージャ」を使用していることを覚えておいてください。この検索には 10 ~ 12 個のクエリがあります。
どんなアイデアでも、これを実現するのに役立ちます。

4

1 に答える 1

1

「|」で区切られた値に問題があることを理解しています。SQL 2008 では、Xml 関数を使用して文字列をテーブルに変換し、ベース テーブルに対してクエリを実行できます。

DECLARE @style VARCHAR(MAX) = 'value1|value2|value3'
DECLARE @v XML 
SET @v = '<r><n>' + REPLACE(@style, '|', '</n><n>') + '</n></r>'

SELECT * FROM mytable
OUTER APPLY 
(
    SELECT c.value('text()[1]', 'varchar(50)') AS v FROM @v.nodes('//n') AS t(c)
) t
WHERE style LIKE '%' + t.v + '%'

それは役に立ちますか?

于 2012-04-27T06:19:35.623 に答える