質問

複数選択リストボックスからの選択に基づいて、SQLサーバーからの結果セットをフィルタリングする必要があります。私は、選択したフィルター値に行の値が存在するかどうかを判断するために文字列を作成するというアイデアを試してきましたが、それは部分的な一致(たとえば、車とカーペットの一致)を起こしやすいです。

また、文字列をテーブルに分割し、それに基づいて結合/マッチングを行いましたが、それがどのように実行されるかについては予約があります。

これは一見一般的なタスクであるように見えるので、スタックオーバーフローコミュニティにフィードバックを求めており、この問題を解決するために最も一般的に利用されているアプローチに関するいくつかの提案を探しています。

役に立ちましたか?

解決

これを解決するには、区切り文字列を取得してテーブルを返すテーブル値関数(2005年を使用しています)を作成しました。その後、それに参加するか、WHERE EXISTSまたはWHERE x INを使用できます。まだ完全なストレステストは行っていませんが、使用が制限され、アイテムのセットがかなり小さい場合、パフォーマンスに問題はないと思います。

以下は、出発点としての機能の1つです。また、ルックアップテーブルなどのID値のINTの区切りリストを特に受け入れるように記述されたものもあります。

別の可能性は、区切り文字でLIKEを使用して部分一致が無視されるようにすることですが、インデックスを使用できないため、大きなテーブルではパフォーマンスが低下します。例:

SELECT
     my_column
FROM
     My_Table
WHERE
     @my_string LIKE '%|' + my_column + '|%'

/*
    Name:       GetTableFromStringList
    Description:    Returns a table of values extracted from a delimited list
    Parameters:
            @StringList - A delimited list of strings
            @Delimiter - The delimiter used in the delimited list

    History:
    Date        Name            Comments
    ----------  -------------   ----------------------------------------------------
    2008-12-03  T. Hummel   Initial Creation
*/
CREATE FUNCTION dbo.GetTableFromStringList
(
    @StringList VARCHAR(1000),
    @Delimiter  CHAR(1) = ','
)
RETURNS @Results TABLE
(
    String  VARCHAR(1000)   NOT NULL
)
AS
BEGIN
    DECLARE
        @string     VARCHAR(1000),
        @position   SMALLINT

    SET @StringList = LTRIM(RTRIM(@StringList)) + @Delimiter
    SET @position = CHARINDEX(@Delimiter, @StringList)

    WHILE (@position > 0)
    BEGIN
        SET @string = LTRIM(RTRIM(LEFT(@StringList, @position - 1)))

        IF (@string <> '')
        BEGIN
            INSERT INTO @Results (String) VALUES (@string)
        END

        SET @StringList = RIGHT(@StringList, LEN(@StringList) - @position)
        SET @position = CHARINDEX(@Delimiter, @StringList, 1)
    END

    RETURN
END

他のヒント

  

私は   行の値が   選択したフィルター値に存在する、   しかし、それは部分的に一致する傾向があります   (例:車がカーペットと一致する)

一意のID、または場合によってはリストボックスの値の一部として主キーを含めていないように思えます。理想的には、各オプションには、検索するテーブルの列に一致する一意の識別子があります。リストボックスが次のようになっている場合、一意の値3を取得するため、特に自動車用にフィルタリングできます。

<option value="3">Car</option>
<option value="4">Carpret</option>

次に、必要な値を検索できるwhere句を作成します。


コメントに答えるために更新されました。

  

関連する参加方法   ユーザーが選択できることを考慮して   および任意の数のオプション   リストボックス? SELECT * FROM tblTable   tblOptions ON tblTable.FK =?の   ここでの問題は、私が参加する必要があることです   複数の値。

同様の質問に回答しましたこちら

1つの方法は、一時テーブルを作成し、選択した各オプションを行として一時テーブルに追加することです。次に、一時テーブルに結合します。

単にSQLを動的に作成する場合は、次のようなことができます。

SELECT * FROM tblTable WHERE option IN (selected_option_1, selected_option_2, selected_option_n)

区切り文字列を取得し、文字列でSplitを呼び出す(IEnumerableとして配列を返す)CLRテーブル値関数は、T-SQLで記述されたものよりもパフォーマンスが高いことがわかりました(区切られたリストには約100万のアイテムがありますが、T-SQLソリューションよりもはるかにはるかに優れています。

そして、テーブルに参加するか、EXISTSで確認できます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top