2012-11-27 3 views
0

가능한 중복 :SQL - SUBSTRING 및 CHARINDEX

Data (field name) 
1111,44,666,77 
22,55,76,54 
32,31,56 

내가 실현 :
T-SQL: Opposite to string concatenation - how to split string into multiple records
Splitting variable length delimited string across multiple rows (SQL)

내가 이런 열 데이터가 들어있는 데이터베이스 테이블이 이것은 매우 가난한 디자인입니다. 그것은 정규화되지 않은 사용 (나는 그것을 설계하지 않았다 - 나는 그것을 상속했다). 이 같은 데이터를 반환하는 쿼리가 있습니까 :

1111 
44 
666 
77 
22 
55 
76 
54 
32 
31 
56 

내가 CHARINDEX 및 문자열을 사용하여 사용 오전,하지만 각 셀의 요소 수로이 일을하는 방법을 생각할 수 없다 (A로 구분 쉼표) 알 수 없습니다.

답변

2

:

;with cte (DataItem, Data) as 
(
    select cast(left(Data, charindex(',',Data+',')-1) as varchar(50)) DataItem, 
     stuff(Data, 1, charindex(',',Data+','), '') Data 
    from yourtable 
    union all 
    select cast(left(Data, charindex(',',Data+',')-1) as varchar(50)) DataItem, 
    stuff(Data, 1, charindex(',',Data+','), '') Data 
    from cte 
    where Data > '' 
) 
select DataItem 
from cte 

참조 SQL Fiddle with Demo

결과 :

| DATAITEM | 
------------ 
|  1111 | 
|  22 | 
|  32 | 
|  31 | 
|  56 | 
|  55 | 
|  76 | 
|  54 | 
|  44 | 
|  666 | 
|  77 | 

또는 당신은 분할 기능을 만들 수 있습니다

,569,446,751,561을 당신은 쿼리 할 때 사용할 수있는이 같은 결과를 생성합니다

은 :

select s.items declaration 
from yourtable t1 
outer apply dbo.split(t1.data, ',') s 
0
SELECT REPLACE(field_name, ',', ' ') from table 

편집 : 당신이 당신의 질문을 변경으로이 답변을 신경 쓰지 마십시오.

+0

나는 그것을 명확하게 질문의 형식을 변경했습니다. 미안합니다. – w0051977

0

비슷한 질문에 언급 된이 문서를 살펴 보자 :

http://www.codeproject.com/Articles/7938/SQL-User-Defined-Function-to-Parse-a-Delimited-Str

당신은 그들이에이 기능을 작성하는 경우 그 기사를 사용하여 전화 할 수 있습니다 :

select * from dbo.fn_ParseText2Table('100|120|130.56|Yes|Cobalt Blue','|')

+0

SQL Server는 테이블 값 함수를 'APPLY'할 수 있습니다 ... 커서가 필요 없습니다! Yikes! – MatBailie

+0

내가 그렇게 말했을 때 무슨 생각을했는지 모르겠다. 내 실수! – Lunyx

2

[dbo]. [stack]이라는 테이블을 만들고 제공된 데이터로 채우고이 스크립트는 필요한 것을 생성했습니다. 이 작업을 수행하는보다 효율적인 방법이있을 수 있지만 요청한 방식대로 작동합니다.

BEGIN 
     DECLARE @tmp TABLE (data VARCHAR(20)) 
     DECLARE @tmp2 TABLE (data VARCHAR(20)) 

     --Insert all fields from your table 
     INSERT INTO @tmp (data) 
     SELECT [data]   
     FROM [dbo].[stack] -- your table name here 

     --Loop through all the records in temp table 
     WHILE EXISTS (SELECT 1 
            FROM @tmp)    
      BEGIN 
       DECLARE @data VARCHAR(100) --Variable to chop up 
       DECLARE @data1 VARCHAR(100) -- Untouched variable to delete from tmp table 
       SET @data = (SELECT TOP 1 [data] 
              FROM @tmp) 
       SET @data1 = (SELECT TOP 1 [data] 
              FROM @tmp) 

       --Loop through variable to get individual value 
       WHILE PATINDEX('%,%',@data) > 0  
        BEGIN 
         INSERT INTO @tmp2 
         SELECT SUBSTRING(@data,1,PATINDEX('%,%',@data)-1); 
         SET @data = SUBSTRING(@data,PATINDEX('%,%',@data)+1,LEN(@data)) 
         IF PATINDEX('%,%',@data) = 0 
          INSERT INTO @tmp2 
          SELECT @data    
        END 

       DELETE FROM @tmp 
       WHERE [data] = @data1 

      END  

     SELECT * FROM @tmp2  
    END 
당신은 데이터를 분할하는 CTE를 사용할 수 있습니다