2013-08-25 1 views
3

그래서 매개 변수가 있습니다. 말할 수 :각 단어의 SQL AND 조건에 쉼표로 구분 된 문자열을 사용해야합니다.

@Tags = 'Red,Large,New' 

을 나는

어떻게 할 수있는 필드가 "빨강, 대형, 새로운, SOMETHINGELSE, AndSomethingElse"를 포함하는 하나 개의 특정 행을 말할 수 있습니다 [태그]라는 내 테이블에 필드가

SELECT * FROM MyTable WHERE 
Tags LIKE 'FirstWordInString' 
AND Tags Like 'SecondWordInString' 
AND Tags Like 'ThirdWordInString' 

그러나 정지 곳은 알고 : 나는 떨어져 기본적으로 내가 이해를 입력 할 수 있습니다 다음과 같은 논리를 달성 것을 파괴하지만 내가 아는 잘못입니까? 한 단어 만 있다면 알아? 아니면 둘? 아니면 셋?

워크 플로 :

사람이 태그를 클릭하고 데이터 세트는 해당 태그에 의해 필터링됩니다. 다른 태그를 클릭하면 태그가 검색 창에 추가되고 데이터 세트가 해당 태그 등으로 필터링됩니다.

감사합니다!

는 업데이트 :

는이 제품을 기반으로 상황이다.

  1. 제품을 만들면 작성자는 쉼표로 구분 된 검색 태그를 입력 할 수 있습니다. 제품이 삽입되면
  2. 은 검색 태그는 제품 테이블에, 나는 그들을 표시 문자열로 분리 한 필드가,

그래서 별도의 테이블이라고 ProductTags (제품 ID, TagID)에 삽입 응용 프로그램 측면에서 이러한 목적으로 사용되는 태그는 ProductID를 기반으로 행별로 구분 된 ProductTag 테이블에서도 찾을 수 있습니다.

검색에있는 모든 태그가 해당 제품에 존재하는 경우 결과를 제공하는 선택 항목에 조건을 배치하는 방법을 잘 모르겠습니다.

SELECT * 
FROM MyTable 
WHERE ','+Tags+',' LIKE '%,FirstWordInString,%' 
    AND ','+Tags+','Like '%,SecondWordInString,%' 
    AND ','+Tags+','Like '%,ThirdWordInString,%' 

UPDATE :

나는 그냥 쉼표로 구분 된 필드를 사용하는 것이 더 쉽습니다,하지만 아마도 내가 그냥 와일드 카드를 추가 할 필요가 해당 테이블 (ProductTags)

+2

데이터베이스를 정상화하면이 작업이 _a lot_ easy _and_ faster가됩니다. – Ben

+0

@Ben - 정규화 된 구조로 관계 분할 쿼리가 그다지 빠르지 않고 쉽습니다. 이 디자인을 옹호하는 것은 아닙니다. DB를 재 설계하고 쿼리가 사소한 것으로 예상되면 OP가 실망 할 수도 있습니다. –

+0

@Ben 더 명확하게하기 위해 내 질문이 업데이트되었습니다. 데이터베이스를 정규화했습니다. – user1447679

답변

2

한 관계형 분할 방법은 @TagsToSearch 테이블이 이상적으로 테이블 반환 매개 변수는 응용 프로그램에서 직접 전달 될 것이다

DECLARE @TagsToSearch TABLE (
    TagId VARCHAR(50) PRIMARY KEY) 

INSERT INTO @TagsToSearch 
VALUES  ('Red'), 
      ('Large'), 
      ('New') 

SELECT PT.ProductID 
FROM ProductTags PT 
     JOIN @TagsToSearch TS 
     ON TS.TagId = PT.TagId 
GROUP BY PT.ProductID 
HAVING COUNT(*) = (SELECT COUNT(*) 
        FROM @TagsToSearch) 

입니다 쉼표로 분리 된 분할 함수를 사용하여 채울 수도 있습니다 매개 변수.

+0

문자열 비교 방식보다 확실히 깨끗합니다. –

+0

내가 만난 몇 가지 독특한 상황에 적응하는 데 어느 정도 시간이 걸렸지 만 이것이 성공으로 이어졌습니다. 고마워요! – user1447679

1

를 사용한다고 생각 : 문제는 태그를 일치시키려는 변수가 있다는 것입니다. 변수에는 태그의 문자열 목록이 있습니다. 당신이 분할 문자열 함수를 사용하여 사용자가 선택한 태그 목록을 분할하거나 사용자가 별도로 입력 폼 태그를 선택받을 수있는 경우에, 당신은 사용할 수 있습니다

SELECT * 
FROM MyTable 
WHERE ',,'+Tags+',' LIKE '%,'[email protected]+',%' 
     AND ',,'+Tags+',' LIKE '%,'[email protected]+',%' 
     AND ',,'+Tags+',' LIKE '%,'[email protected]+',%' 
     AND ',,'+Tags+',' LIKE '%,'[email protected]+',%' 

이가 작동합니다 여러 개의 입력 된 태그가 비어있는 경우 @tag은 태그 입력란 '%,,%'에 추가 된 쉼표가 추가로 표시됩니다.CodeProject의에서

+0

하지만 검색에 1 개의 태그가 포함되어 있거나 다른 검색에 5가 포함되어 있으면 어떻게됩니까? – user1447679

+0

업데이트됨에 따라이를 수행하는 더 좋은 방법 일 수 있습니다. –

0

다음 ProductTags 테이블을 사용하여

-- ============================================= 
-- Author: Md. Marufuzzaman 
-- Create date: 
-- Description: Split an expression. 
-- Note: If you are using SQL Server 2000, You need to change the 
-- length (MAX) to your maximum expression length of each datatype. 
-- ============================================= 
/* 
SELECT * FROM [dbo].[SPLIT] (';','I love codeProject;!!!;Your development resources') 
*/ 
CREATE FUNCTION [dbo].[SPLIT] 
( @DELIMITER VARCHAR(5), 
    @LIST  VARCHAR(MAX) 
) 
    RETURNS @TABLEOFVALUES TABLE 
    ( ROWID SMALLINT IDENTITY(1,1), 
    [VALUE] VARCHAR(MAX) 
) 
AS 
BEGIN 

    DECLARE @LENSTRING INT 

    WHILE LEN(@LIST) > 0 
    BEGIN 

     SELECT @LENSTRING = 
      (CASE CHARINDEX(@DELIMITER, @LIST) 
       WHEN 0 THEN LEN(@LIST) 
       ELSE (CHARINDEX(@DELIMITER, @LIST) -1) 
      END 
      ) 

     INSERT INTO @TABLEOFVALUES 
      SELECT SUBSTRING(@LIST, 1, @LENSTRING) 

     SELECT @LIST = 
      (CASE (LEN(@LIST) - @LENSTRING) 
       WHEN 0 THEN '' 
       ELSE RIGHT(@LIST, LEN(@LIST) - @LENSTRING - 1) 
      END 
      ) 
    END 

    RETURN 

END 

http://www.codeproject.com/Articles/38843/An-Easy-But-Effective-Way-to-Split-a-String-using

+0

어떻게 핵심 문제를 해결하는 데 도움이됩니까? OP는 ** 모든 ** "파트 - 태그"를 포함하는 모든 태그를 원합니다. –

+0

더 명확하게하기 위해 제 질문이 업데이트되었습니다. 초기 부족에 대해 사과드립니다. – user1447679

+0

나는 쉼표로 구분 된 값을 포함하는 테이블을 반환합니다. 검색중인 값에 대해 해당 테이블을 쿼리 할 수 ​​있습니다. – Oscar