[SQL] 어떻게 T-SQL을 사용하여 구분 기호 문자를 사용하여 문자열을 분할하려면?
SQL어떻게 T-SQL을 사용하여 구분 기호 문자를 사용하여 문자열을 분할하려면?
나는 테이블의 열 중 하나에서이 긴 문자열이 있습니다. 나는 특정 정보를 얻으려면 : - 내 테이블 구조 : -
Col1 = '123'
Col2 = 'AAAAA'
Col3 = 'Clent ID = 4356hy|Client Name = B B BOB|Client Phone = 667-444-2626|Client Fax = 666-666-0151|Info = INF8888877 -MAC333330554/444400800'
내 select 문은 다음과 같습니다 -
Select col1, col2, col3 from Table01
그러나 열 3 나는 단지 B B BOB ''는 클라이언트 이름의 값을 '이 필요합니다.
열 3에서 -
도와주세요.
해결법
-
==============================
1.특정 데이터의 경우, 당신은 사용할 수 있습니다
특정 데이터의 경우, 당신은 사용할 수 있습니다
Select col1, col2, LTRIM(RTRIM(SUBSTRING( STUFF(col3, CHARINDEX('|', col3, PATINDEX('%|Client Name =%', col3) + 14), 1000, ''), PATINDEX('%|Client Name =%', col3) + 14, 1000))) col3 from Table01
테스트
select col3='Clent ID = 4356hy|Client Name = B B BOB|Client Phone = 667-444-2626|Client Fax = 666-666-0151|Info = INF8888877 -MAC333330554/444400800' into t1m from master..spt_values a cross join master..spt_values b where a.number < 100 -- (711704 row(s) affected) set statistics time on dbcc dropcleanbuffers dbcc freeproccache select a=CHARINDEX('|Client Name =', col3) into #tmp1 from t1m drop table #tmp1 dbcc dropcleanbuffers dbcc freeproccache select a=PATINDEX('%|Client Name =%', col3) into #tmp2 from t1m drop table #tmp2 set statistics time off
타이밍
CHARINDEX: SQL Server Execution Times (1): CPU time = 5656 ms, elapsed time = 6418 ms. SQL Server Execution Times (2): CPU time = 5813 ms, elapsed time = 6114 ms. SQL Server Execution Times (3): CPU time = 5672 ms, elapsed time = 6108 ms. PATINDEX: SQL Server Execution Times (1): CPU time = 5906 ms, elapsed time = 6296 ms. SQL Server Execution Times (2): CPU time = 5860 ms, elapsed time = 6404 ms. SQL Server Execution Times (3): CPU time = 6109 ms, elapsed time = 6301 ms.
결론
내가 사용 중 문제가 것입니다 생각하지 않도록 라니 통화 CHARINDEX 및 PATINDEX의 타이밍은, 서로의 3.5 % 이내이다. 모두가 사용할 수 있습니다 교환 할 때 그들을 사용합니다.
-
==============================
2.당신은 분할 기능이 필요합니다 :
당신은 분할 기능이 필요합니다 :
SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO Create Function [dbo].[udf_Split] ( @DelimitedList nvarchar(max) , @Delimiter nvarchar(2) = ',' ) RETURNS TABLE AS RETURN ( With CorrectedList As ( Select Case When Left(@DelimitedList, Len(@Delimiter)) <> @Delimiter Then @Delimiter Else '' End + @DelimitedList + Case When Right(@DelimitedList, Len(@Delimiter)) <> @Delimiter Then @Delimiter Else '' End As List , Len(@Delimiter) As DelimiterLen ) , Numbers As ( Select TOP( Coalesce(DataLength(@DelimitedList)/2,0) ) Row_Number() Over ( Order By c1.object_id ) As Value From sys.columns As c1 Cross Join sys.columns As c2 ) Select CharIndex(@Delimiter, CL.list, N.Value) + CL.DelimiterLen As Position , Substring ( CL.List , CharIndex(@Delimiter, CL.list, N.Value) + CL.DelimiterLen , CharIndex(@Delimiter, CL.list, N.Value + 1) - ( CharIndex(@Delimiter, CL.list, N.Value) + CL.DelimiterLen ) ) As Value From CorrectedList As CL Cross Join Numbers As N Where N.Value <= DataLength(CL.List) / 2 And Substring(CL.List, N.Value, CL.DelimiterLen) = @Delimiter )
당신의 분할 기능을 사용하면 다음 데이터를 얻을 수 크로스를 적용 사용합니다 :
Select T.Col1, T.Col2 , Substring( Z.Value, 1, Charindex(' = ', Z.Value) - 1 ) As AttributeName , Substring( Z.Value, Charindex(' = ', Z.Value) + 1, Len(Z.Value) ) As Value From Table01 As T Cross Apply dbo.udf_Split( T.Col3, '|' ) As Z
-
==============================
3.당신은 단순히 COL3의 문자열에 SUBSTR을 할 필요가 ....
당신은 단순히 COL3의 문자열에 SUBSTR을 할 필요가 ....
Select col1, col2, REPLACE(substr(col3, instr(col3, 'Client Name'), (instr(col3, '|', instr(col3, 'Client Name') - instr(col3, 'Client Name')) ), 'Client Name = ', '') from Table01
그리고 네, 그것은 원래의 문제에 명시된 이유에 대한 나쁜 DB 디자인이다
-
==============================
4.그것은 끔찍한,하지만 당신은 사용하려고 할 수 있습니다
그것은 끔찍한,하지만 당신은 사용하려고 할 수 있습니다
select SUBSTRING(Table1.Col1,0,PATINDEX('%|%=',Table1.Col1)) as myString from Table1
이 코드는 잘하지만 아마 100 %입니다. 필요 조정한다
from https://stackoverflow.com/questions/5096630/how-to-split-string-using-delimiter-char-using-t-sql by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] 액세스에서 그룹 SQL 당 상위 N 개 기록 (0) | 2020.05.05 |
---|---|
[SQL] .NET에서 동적 SQL에서 살균 테이블 / 열 이름? (방지 SQL 인젝션) (0) | 2020.05.05 |
[SQL] 에 .dtsx 파일에서 자동화 버전 번호 검색 (0) | 2020.05.05 |
[SQL] C #을 구성하는 매개 변수 쿼리의 SQL - LIKE %의 (0) | 2020.05.05 |
[SQL] 암시 적 및 명시 적 조인 혼합 (0) | 2020.05.05 |