복붙노트

[SQL] 열 함유 쉼표의 값이 값을 구분 어디에

SQL

열 함유 쉼표의 값이 값을 구분 어디에

나는 항목이 열이 이제 열에서 값이 쉼표로 구분 된 목록이며, 값이 들어 어디를 선택하는 것이 SQL Server 2008 용 SQL 문을 작성하고자하는 - 그래서 (일반적으로 하나 개의 항목 만 (그리고 선두에 쉼표가있을 수 있음)) 무엇을 입니다 확인에서 "이 값이 목록 내 어딘가에 포함입니까?"예를 들어 :

COLUMN = Cat, Dog, Sparrow, Trout, Cow, Seahorse
Does COLUMN contain Cat? YES
Does COLUMN contain horse? NO
Does COLUMN contain Sheep? NO

또는

COLUMN = Mouse
Does COLUMN contain Hare? NO
Does COLUMN contain Mouse? YES

기타

나는과 같은 'IN'키워드를 사용할 수 있습니다 생각

SELECT id_column FROM table_name WHERE 'Cat' IN COLUMN

당신은 열이 쉼표로 구분 된 일련의 값 중 하나가 포함되어 있는지 확인하는 것을 사용할 수있는 보인다하지만이 작동하지 않습니다.

나는 또한 수 없습니다 사용은 () 또는이 같은 'LIKE'가 전체 문자열로 '말'에 대한 값을 반환 위의 예에서 '해마'에 말을 포함 포함되어 있으며, 나는 (만약 바늘 플러스 쉼표를 검색 할 수 없습니다 항목이리스트 a의 끝에서 무엇처럼 나는 '말'검색이 될 것 '말')를 찾고 있어요? 그리고 쉼표 플러스 바늘 검색 할 수 없습니다 (I 검색이 될 것 '말'을 찾고 있다면 '말') 만약에 같은 항목이 목록의 첫 번째입니까? 항목이 유일하게 (단일) 항목이있는 경우 그리고 나는 무엇으로 모두 사용할 수없는 이유는 무엇입니까?

해결법

  1. ==============================

    1.하나 개의 까다로운 시나리오가있다. 나는 목록 '17, 34,400,12에 '40'을 찾고 있다면 '다음은 "40"를 찾아 반환 잘못된 항목이 그 것이다. 이것은 모든 솔루션을 처리합니다 :

    하나 개의 까다로운 시나리오가있다. 나는 목록 '17, 34,400,12에 '40'을 찾고 있다면 '다음은 "40"를 찾아 반환 잘못된 항목이 그 것이다. 이것은 모든 솔루션을 처리합니다 :

    WHERE (',' + RTRIM(MyColumn) + ',') LIKE '%,' + @search + ',%'
    
  2. ==============================

    2.

    WHERE
          MyColumn LIKE '%,' + @search + ',%' --middle
          OR
          MyColumn LIKE @search + ',%' --start
          OR
          MyColumn LIKE '%,' + @search --end
          OR 
          MyColumn =  @search --single (good point by Cheran S in comment)
    
  3. ==============================

    3.

    SELECT * FROM TABLENAME WHERE FIND_IN_SET(@search, column)
    

    그것은 당신의 열이 밝혀지면 목록 항목 사이의 사용에 공백이있다

    SELECT * FROM TABLENAME WHERE FIND_IN_SET(@search, REPLACE(column, ' ', ''))
    

    http://dev.mysql.com/doc/refman/5.0/en/string-functions.html

  4. ==============================

    4.

    DECLARE @search VARCHAR(10);
    SET @search = 'Cat';
    
    WITH T(C)
    AS
    (
    SELECT 'Cat, Dog, Sparrow, Trout, Cow, Seahorse'
    )
    SELECT *
    FROM T 
    WHERE ', ' + C + ',' LIKE '%, ' + @search + ',%'
    

    물론이 뜻은 모든 검색에 대한 전체 테이블 스캔을 필요로한다.

  5. ==============================

    5.나는 다른 포럼이 대답은, 완벽하게 작동 발견했다. 또한 (10)가있는 경우 1을 찾는 아무런 문제 없다

    나는 다른 포럼이 대답은, 완벽하게 작동 발견했다. 또한 (10)가있는 경우 1을 찾는 아무런 문제 없다

    WHERE tablename REGEXP "(^|,)@search(,|$)"
    

    난 여기가 발견

  6. ==============================

    6.

    select *
    from YourTable
    where ','+replace(col, ' ', '')+',' like '%,Cat,%'
    
  7. ==============================

    7.이 경우, 가장 좋은 방법은 (제 1 정규형 1NF) http://en.wikipedia.org/wiki/First_normal_form 쉼표가 다른 행의 값을 구분하도록 테이블을 정상화하는 것

    이 경우, 가장 좋은 방법은 (제 1 정규형 1NF) http://en.wikipedia.org/wiki/First_normal_form 쉼표가 다른 행의 값을 구분하도록 테이블을 정상화하는 것

    이를 위해, 당신은 CLR http://bi-tch.blogspot.com/2007/10/sql-clr-net-function-split.html를 사용하거나 일반 SQL을 사용하여 SQL에서 좋은 분할 테이블 반환 함수를 구현할 수 있습니다.

    CREATE FUNCTION dbo.Split
    (
        @RowData nvarchar(2000),
        @SplitOn nvarchar(5)
    )  
    RETURNS @RtnValue table 
    (
        Id int identity(1,1),
        Data nvarchar(100)
    ) 
    AS  
    BEGIN 
        Declare @Cnt int
        Set @Cnt = 1
    
        While (Charindex(@SplitOn,@RowData)>0)
        Begin
            Insert Into @RtnValue (data)
            Select 
                Data = ltrim(rtrim(Substring(@RowData,1,Charindex(@SplitOn,@RowData)-1)))
    
            Set @RowData = Substring(@RowData,Charindex(@SplitOn,@RowData)+1,len(@RowData))
            Set @Cnt = @Cnt + 1
        End
    
        Insert Into @RtnValue (data)
        Select Data = ltrim(rtrim(@RowData))
    
        Return
    END
    

    그럼 당신은 교차 적용 사용하여 표준화 된 출력을 조회 할 수 있습니다

    select distinct a.id_column
    from   MyTable a cross apply
           dbo.Split(A.MyCol,',') b
    where  b.Data='Cat'
    
  8. ==============================

    8.

    SELECT * FROM TABLE_NAME WHERE
            (
                LOCATE(',DOG,', CONCAT(',',COLUMN,','))>0 OR
                LOCATE(',CAT,', CONCAT(',',COLUMN,','))>0
            );
    
  9. ==============================

    9.그냥 내가 비슷한 문제에 대한 해결책을 검색 할 때 이것에 대해 알게되었습니다. SQL은 당신이 사용할 수 CONTAINS라는 새로운 키워드를 가지고있다. 자세한 내용은 참조하십시오 http://msdn.microsoft.com/en-us/library/ms187787.aspx

    그냥 내가 비슷한 문제에 대한 해결책을 검색 할 때 이것에 대해 알게되었습니다. SQL은 당신이 사용할 수 CONTAINS라는 새로운 키워드를 가지고있다. 자세한 내용은 참조하십시오 http://msdn.microsoft.com/en-us/library/ms187787.aspx

  10. ==============================

    10.당신은 당신이 찾을 수 있습니다 얼마나 많은 쉼표로 구분 된 항목을 알 수 없기 때문에, 당신은 'charIndex에'와 '문자열'SQL 서버 기능을 가진 함수를 작성해야 할 수도 있습니다. 같은 함수에 의해 리턴 된 값은 식 '에'(A)에 사용될 수있다.

    당신은 당신이 찾을 수 있습니다 얼마나 많은 쉼표로 구분 된 항목을 알 수 없기 때문에, 당신은 'charIndex에'와 '문자열'SQL 서버 기능을 가진 함수를 작성해야 할 수도 있습니다. 같은 함수에 의해 리턴 된 값은 식 '에'(A)에 사용될 수있다.

    당신은 재귀 적으로 호출 할 수있는 기능 또는 더 이상 항목이 문자열에 존재하지 않을 때까지 당신은 항목을 검색, 루프를 만들 수 있습니다. 함수에 대한 모든 호출은 다음 호출의 시작 지점으로 이전 FOUND 인덱스를 사용합니다. 첫 번째 호출은 0에서 시작한다.

  11. ==============================

    11.당신이 ID는 문자열보다는 알고있는 경우,이 방법을 사용 :

    당신이 ID는 문자열보다는 알고있는 경우,이 방법을 사용 :

    where mylookuptablecolumn IN (myarrayorcommadelimitedarray)
    

    그냥 확인 myarrayorcommadelimitedarray 문자열 따옴표에 넣어되지 않았는지 확인합니다.

    당신이 A 또는 B를 원하지만,하지 및 작동합니다.

  12. ==============================

    12.하지만 까다로운 솔루션 @ 조언 tbaxter120 좋은 것입니다하지만 난 마치 마법처럼이 기능과 작업을 사용 pString는 구분 된 문자열이며 pDelimiter는 구분 문자입니다 :

    하지만 까다로운 솔루션 @ 조언 tbaxter120 좋은 것입니다하지만 난 마치 마법처럼이 기능과 작업을 사용 pString는 구분 된 문자열이며 pDelimiter는 구분 문자입니다 :

    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO
    
    ALTER FUNCTION [dbo].[DelimitedSplit]
    --===== Define I/O parameters
            (@pString NVARCHAR(MAX), @pDelimiter CHAR(1))
    RETURNS TABLE WITH SCHEMABINDING AS
     RETURN
    --===== "Inline" CTE Driven "Tally Table" produces values from 0 up to 10,000...
         -- enough to cover VARCHAR(8000)
      WITH E1(N) AS (
                     SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL 
                     SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL 
                     SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1
                    ),                          --10E+1 or 10 rows
           E2(N) AS (SELECT 1 FROM E1 a, E1 b), --10E+2 or 100 rows
           E4(N) AS (SELECT 1 FROM E2 a, E2 b), --10E+4 or 10,000 rows max
     cteTally(N) AS (--==== This provides the "base" CTE and limits the number of rows right up front
                         -- for both a performance gain and prevention of accidental "overruns"
                     SELECT TOP (ISNULL(DATALENGTH(@pString),0)) ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) FROM E4
                    ),
    cteStart(N1) AS (--==== This returns N+1 (starting position of each "element" just once for each delimiter)
                     SELECT 1 UNION ALL -- does away with 0 base CTE, and the OR condition in one go!
                     SELECT t.N+1 FROM cteTally t WHERE SUBSTRING(@pString,t.N,1) = @pDelimiter
                    ),
    cteLen(N1,L1) AS(--==== Return start and length (for use in substring)
                     SELECT s.N1,
                            ---ISNULL(NULLIF(CHARINDEX(@pDelimiter,@pString,s.N1),0)-s.N1,8000)
                            ISNULL(NULLIF(CHARINDEX(@pDelimiter,@pString,s.N1),0)-s.N1,50000)
                       FROM cteStart s
                    )
    --===== Do the actual split. The ISNULL/NULLIF combo handles the length for the final element when no delimiter is found.
     SELECT ItemNumber = ROW_NUMBER() OVER(ORDER BY l.N1),
            Item       = SUBSTRING(@pString, l.N1, l.L1)
       FROM cteLen l
    
    ;
    

    그리고 예를 들어, 당신은 다음과 같이 where 절에서 호출 할 수 있습니다 :

    WHERE [fieldname] IN (SELECT LTRIM(RTRIM(Item)) FROM [dbo].[DelimitedSplit]('2,5,11', ','))
    

    이 도움을 바랍니다.

  13. ==============================

    13.열 함유 콤마 구분 값이 어디에 값이 구분 된 복수의 쉼표 검색

    열 함유 콤마 구분 값이 어디에 값이 구분 된 복수의 쉼표 검색

                declare @d varchar(1000)='-11,-12,10,121'
    
                set @d=replace(@d,',',',%'' or '',''+a+'','' like ''%,')
    
                print @d
                declare @d1 varchar(5000)=
                'select * from (
                select ''1,21,13,12'' as a
                union
                select ''11,211,131,121''
                union
                select ''411,211,131,1211'') as t
                 where '',''+a+'','' like ''%,'+@d+ ',%'''
    
                 print @d1
                 exec (@d1)
    
  14. from https://stackoverflow.com/questions/5611715/where-value-in-column-containing-comma-delimited-values by cc-by-sa and MIT license