SQL Serverを使用した複数選択ボックスでのフィルタリング
-
03-07-2019 - |
質問
複数選択リストボックスからの選択に基づいて、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で確認できます。