SQL Server가있는 다중 선택 상자로 필터링
-
03-07-2019 - |
문제
다중 선택 목록 상자의 선택을 기반으로 SQL Server의 결과 세트를 필터링해야합니다. 나는 선택한 필터 값에 행 값이 존재하는지 판단하기 위해 악기를 수행한다는 아이디어를 겪었지만 부분 일치가 발생하기 쉽다 (예 : 자동차는 카펫과 일치).
또한 문자열을 테이블로 나누고 그에 따라 결합/일치하는 방법을 통해 수행했지만 어떻게 수행 할 것인지에 대한 예약이 있습니다.
이것이 겉보기에 일반적인 과제라는 것을 보았을 때, 나는 일부 피드백을 위해 스택 오버플로 커뮤니티를 찾고 있으며,이 문제를 해결하기 위해 가장 일반적으로 활용되는 접근법에 대한 몇 가지 제안을 할 수 있습니다.
해결책
테이블 값 함수 (2005 년 사용)를 작성하여 구분 된 문자열을 사용하고 테이블을 반환 하여이 문제를 해결했습니다. 그런 다음 그에 가입하거나 존재하는 곳이나 X가있는 곳을 사용할 수 있습니다. 우리는 아직 완전한 스트레스 테스트를 수행하지 않았지만, 제한된 사용과 합리적으로 작은 항목 세트로 성능이 괜찮을 것이라고 생각합니다.
아래는 당신의 출발점으로 기능 중 하나입니다. 또한 조회 테이블 등의 ID 값에 대한 구분 된 INT 목록을 구체적으로 수락하도록 작성된 것도 있습니다.
또 다른 가능성은 부분적 일치가 무시되도록 구분자와 같이 사용하는 것입니다. 그러나 그와 함께 인덱스를 사용할 수 없으므로 큰 테이블의 경우 성능이 좋지 않습니다. 예를 들어:
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 또는 목록 상자의 값의 일부로 기본 키를 포함하지 않는 것처럼 들립니다. 이상적으로 각 옵션에는 검색중인 테이블의 열과 일치하는 고유 식별자가 있습니다. ListBox가 아래에있는 경우 고유 한 값 3을 얻을 수 있기 때문에 자동차를 위해 특별히 필터링 할 수 있습니다.
<option value="3">Car</option>
<option value="4">Carpret</option>
그런 다음 필요한 값을 찾을 수있는 WHERE 절을 작성합니다.
댓글에 답하기 위해 업데이트되었습니다.
사용자가 목록 상자에서 임의의 옵션을 선택하고 임의의 수를 선택할 수 있다는 점을 고려하여 관련 조인을 어떻게해야합니까? tbltable.fk =에서 tbltable join tbloptions에서 *를 선택하십시오. 여기서 문제는 여러 값에 가입해야한다는 것입니다.
나는 비슷한 질문에 대답했다 여기.
한 가지 방법은 임시 테이블을 작성하고 선택한 각 옵션을 임시 테이블에 행으로 추가하는 것입니다. 그런 다음 단순히 임시 테이블에 가입 할 수 있습니다.
단순히 SQL을 동적으로 만들려면 이와 같은 일을 할 수 있습니다.
SELECT * FROM tblTable WHERE option IN (selected_option_1, selected_option_2, selected_option_n)
구분 된 문자열을 가져 와서 문자열에서 분할 된 CLR 테이블 값 함수 (Ienumerable로 배열을 반환)가 T-SQL로 작성된 것보다 더 성능이 있음을 발견했습니다 (주위에있을 때 분해하기 시작합니다. 구분 된 목록에 백만 개의 항목이 있지만 T-SQL 솔루션보다 훨씬 더 멀다).
그런 다음 테이블에 가입하거나 존재로 확인할 수 있습니다.