문제

다중 선택 목록 상자의 선택을 기반으로 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 솔루션보다 훨씬 더 멀다).

그런 다음 테이블에 가입하거나 존재로 확인할 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top