2017-04-02 7 views
0

SQL Server에서 슬래시로 분해 된 각 문자열의 날짜를 반환하고 싶습니다. SQL Server의 일부 열에서 값의 반환 날짜가

내 데이터베이스 테이블 :

id | date  | col1  | col2  | col3 | col4 
---+------------+-------------+-----------+-------+------------ 
1 | 2017-04-02 | /txt1/txt2 |   |  | 
2 | 2017-04-03 |    | /txt1/txt4|  | 
3 | 2017-04-04 |    |/txt2/txt3 |  | 
4 | 2017-04-05 |    |/txt4  |  |/txt5/txt6 

결과가 원하는 :

2017-04-02 txt1 
2017-04-02 txt2 
2017-04-03 txt1 
2017-04-03 txt4 
2017-04-04 txt2 
2017-04-04 txt3 
2017-04-05 txt4 
2017-04-05 txt5 
2017-04-05 txt6 

감사합니다 피에르

+2

그럼, 왜 당신은 당신이 지금까지 시도 것을 우리와 함께 공유하지 않는? –

+0

읽기 [데이터베이스 열에 구분 된 목록을 저장하는 것이 실제로 그렇게 나쁜 것입니까?] (http://stackoverflow.com/questions/3653462/is-storing-a-delimited-list-in-a-database-column-really- 이 질문에 대한 대답은 ** ** 그렇습니다! ** –

+0

@ ZoharPeled OP가 데이터베이스 디자인에 책임이 없지만 그럴 수도 있습니다. –

답변

1

당신이 (SQL 서버 2016에서 사용 가능) STRING_SPLIT() function를 사용할 수 있다고 가정 먼저해야합니다 varchar 열을 토큰 화하는 함수. 웹에는 수백 가지가 있습니다. 가장 적합하고 잘 테스트 된 것을 고르려고합니다.

내 예를 들어 나는 당신의 샘플 작동하는 this로 이동합니다 것을

CREATE FUNCTION [dbo].[fnSplitString] 
( 
    @string NVARCHAR(MAX), 
    @delimiter CHAR(1) 
) 
RETURNS @output TABLE(splitdata NVARCHAR(MAX) 
) 
BEGIN 
    DECLARE @start INT, @end INT 
    SELECT @start = 1, @end = CHARINDEX(@delimiter, @string) 
    WHILE @start < LEN(@string) + 1 BEGIN 
     IF @end = 0 
      SET @end = LEN(@string) + 1 

     INSERT INTO @output (splitdata) 
     VALUES(SUBSTRING(@string, @start, @end - @start)) 
     SET @start = @end + 1 
     SET @end = CHARINDEX(@delimiter, @string, @start) 

    END 
    RETURN 
END 

적용 분할 기능

select t.date, x.splitdata 
from test t 
cross apply dbo.fnSplitString(
    coalesce(col1, '') + coalesce(col2, '') 
    + coalesce(col3, '') + coalesce(col4, '') 
, '/') x 
where coalesce(x.splitdata, '') <> '' 

rextester demo

참고 데모에서 I date 열 대신 Id 열을 사용했습니다.

+0

Aaron Bertrand의 [적절한 방법으로 문자열을 분할하거나 다음 최선의 방법으로] (https://sqlperformance.com/2012/07/t-sql-queries/split-strings) –

+0

위대한 참조 @ZoharPeled. –

+0

@GiorgosAltanis 노력할만한 가치가 있습니다. 성능 향상에 놀랄 수 있습니다. –

0

누구나 Zohar Peled와 연결된 좋은 분할/구문 분석 기능을 가지고 있어야합니다.

UDF를 사용할 수 없거나 원하는 경우 다른 옵션입니다.

Select A.Date 
     ,C.RetVal 
From YourTable A 
Cross Apply (values (col1),(col2),(col3),(col4)) B (Value) 
Cross Apply (
       Select RetSeq = Row_Number() over (Order By (Select null)) 
         ,RetVal = LTrim(RTrim(B.i.value('(./text())[1]', 'varchar(max)'))) 
       From (Select x = Cast('<x>' + replace((Select replace(B.Value,'/','§§Split§§') as [*] For XML Path('')),'§§Split§§','</x><x>')+'</x>' as xml).query('.')) as A 
       Cross Apply x.nodes('x') AS B(i) 
      ) C 
Where C.RetVal is not null 

반환

Date  RetVal 
2017-04-02 txt1 
2017-04-02 txt2 
2017-04-03 txt1 
2017-04-03 txt4 
...