[SQL] SQL Server 2008의 쉼표에 의해 분할 기능
SQLSQL Server 2008의 쉼표에 의해 분할 기능
나는이 질문에 여러 번 요청되었습니다하지만 내가 필요한 것을 찾을 수 있다는 것을 알고있다.
이 칼럼 다음과 같은 형식의 데이터가 들어있는 "주문"을 가지고있다. 'XXX, YYY, ZZZZ' 내 SELECT 문을 수행 할 때 지금은 분할 이것에 의해 3 열을 채울 필요
EG
Select Name,
Surname,
FirstCommaColumn=xx.UpToFirstColumn
SecondCommaColumn=xx.FromFirstCommaToLastComma,
ThirdColumnFromSecondCommaOnwards=FromSecondCommaToEnd
from myTable
--thought of doing something like
CROSS APPLY (SELECT TOP 1 * FROM dbo.SplitFunctionIDontHave(order,',')) AS xx
나는 빈을 반환해야하므로 더 쉼표가없는 일부 행이 있습니다. 내가 함수 또는 쿼리 그냥 확인이 작업을 수행하는 방법을 자체 내에서 할 경우 난 상관하지 않습니다.
어떻게 2008 SQL Server를 사용하여이 작업을 수행 할 수 있습니까? 차이를 만드는 경우,이 선택은 뷰의 일부입니다
해결법
-
==============================
1.나는 그것이 분할 () 함수는 정말 무엇에 중복되지 않도록 함수 이름을 변경했습니다.
나는 그것이 분할 () 함수는 정말 무엇에 중복되지 않도록 함수 이름을 변경했습니다.
여기에 코드입니다 :
CREATE FUNCTION dbo.GetColumnValue( @String varchar(8000), @Delimiter char(1), @Column int = 1 ) returns varchar(8000) as begin declare @idx int declare @slice varchar(8000) select @idx = 1 if len(@String)<1 or @String is null return null declare @ColCnt int set @ColCnt = 1 while (@idx != 0) begin set @idx = charindex(@Delimiter,@String) if @idx!=0 begin if (@ColCnt = @Column) return left(@String,@idx - 1) set @ColCnt = @ColCnt + 1 end set @String = right(@String,len(@String) - @idx) if len(@String) = 0 break end return @String end
그리고 여기 사용법은 다음과 같습니다
select dbo.GetColumnValue('Col1,Field2,VAlue3', ',', 3)
-
==============================
2.
Declare @str as Varchar(100) = '10|20|30|40|500|55' Declare @delimiter As Varchar(1)='|' Declare @Temp as Table ( item varchar(100)) Declare @i as int=0 Declare @j as int=0 Set @j = (Len(@str) - len(REPLACE(@str,@delimiter,''))) While @i < = @j Begin if @i < @j Begin Insert into @Temp Values(SUBSTRING(@str,1,Charindex(@delimiter,@str,1)-1)) set @str = right(@str,(len(@str)- Charindex(@Delominator,@str,1))) End Else Begin Insert into @Temp Values(@str) End Set @i = @i + 1 End Select * from @Temp
-
==============================
3.이 SQL 서버에는 분할 () 함수는 없지만, 당신은 사용자 정의 함수를 만들 수 있습니다.
이 SQL 서버에는 분할 () 함수는 없지만, 당신은 사용자 정의 함수를 만들 수 있습니다.
열을 쉼표로 구분 된 값을 분할하는 방법이 대답을 참조
-
==============================
4.다음과 같은 기능 및 용도 아래를 만들
다음과 같은 기능 및 용도 아래를 만들
CREATE FUNCTION [dbo].[Split] ( @List nvarchar(2000), @SplitOn nvarchar(5) ) RETURNS @RtnValue table ( Id int identity(1,1), Value nvarchar(100) ) AS BEGIN While (Charindex(@SplitOn,@List)>0) Begin Insert Into @RtnValue (value) Select Value = ltrim(rtrim(Substring(@List,1,Charindex(@SplitOn,@List)-1))) Set @List = Substring(@List,Charindex(@SplitOn,@List)+len(@SplitOn),len(@List)) End Insert Into @RtnValue (Value) Select Value = ltrim(rtrim(@List)) Return END SELECT TOP 1 * FROM dbo.Split(order,',')
-
==============================
5.그것은 parsename 함께 플레이 할 수있는 좋은 사례처럼 보인다.
그것은 parsename 함께 플레이 할 수있는 좋은 사례처럼 보인다.
예를 들어 @Order를 사용하는 편집 :
DECLARE @Order VARCHAR(MAX) = 'xxx,yyy,zzzz' SELECT FirstCommaColumn=PARSENAME(REPLACE(@Order,',','.'),3), SecondCommaColumn=PARSENAME(REPLACE(@Order,',','.'),2), ThirdColumnFromSecondCommaOnwards=PARSENAME(REPLACE(@Order,',','.'),1)
-
==============================
6.
CREATE FUNCTION [dbo].[splitStr] ( @str NVARCHAR(MAX), @delimiter CHAR(1) ) RETURNS @output TABLE( RowID smallint IDENTITY(1,1), t1 NVARCHAR(MAX) , t2 NVARCHAR(MAX) , t3 NVARCHAR(MAX) , t4 NVARCHAR(MAX) , t5 NVARCHAR(MAX) , t6 NVARCHAR(MAX) , t7 NVARCHAR(MAX) , t8 NVARCHAR(MAX) , t9 NVARCHAR(MAX) , t10 NVARCHAR(MAX) ) begin declare @st int, @en int, @xx int declare @cntr int set @cntr = 0 set @st = 1 select @en = CHARINDEX(@delimiter, @str, @st) if @en = 0 set @en = LEN(@str) while @en <= LEN(@str) and @cntr < 11 begin set @cntr = @cntr + 1 set @xx = @en - @st if @cntr = 1 insert into @output(t1) values(SUBSTRING(@str, @st, @xx)) if @cntr = 2 update @output set t2 = SUBSTRING(@str, @st, @xx) if @cntr = 3 update @output set t3 = SUBSTRING(@str, @st, @xx) if @cntr = 4 update @output set t4 = SUBSTRING(@str, @st, @xx) if @cntr = 5 update @output set t5 = SUBSTRING(@str, @st, @xx) if @cntr = 6 update @output set t6 = SUBSTRING(@str, @st, @xx) if @cntr = 7 update @output set t7 = SUBSTRING(@str, @st, @xx) if @cntr = 8 update @output set t8 = SUBSTRING(@str, @st, @xx) if @cntr = 9 update @output set t9 = SUBSTRING(@str, @st, @xx) if @cntr = 10 update @output set t10 = SUBSTRING(@str, @st, @xx) set @st = @en + 1 if @st > len(@str) begin set @en = @en + 100 end else begin select @en = CHARINDEX(@delimiter,@str, @st) if @en = 0 begin set @en = LEN(@str) set @xx = @en - @st end end end return end
/*
이것은 당신이 구분에 의해 10 개 필드로 분할 할 수 있습니다. 요구 사항이 10을 초과하는 경우에는 목록에 더 추가 할 수 있습니다.
용법
select * from TableName a cross apply splitStr(a.FiledName, ',')
*/
from https://stackoverflow.com/questions/20512855/split-function-by-comma-in-sql-server-2008 by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] 어떻게 데이터에 대한 상호 참조 테이블 / 쿼리를 만들려면 어떻게해야합니까? (0) | 2020.06.17 |
---|---|
[SQL] 자바 SQL : Statement.hasResultSet ()? (0) | 2020.06.17 |
[SQL] 어떤 SQL 매개 변수 당신을 보호합니까에서? (0) | 2020.06.17 |
[SQL] 당신은 MS Access 2003에서 매개 변수가있는 쿼리를 작성하고 매개 변수를 채우기 위해 다른 쿼리 / 양식을 사용하고 결과 집합을 어떻게받을 수 있습니까 (0) | 2020.06.17 |
[SQL] WM_CONCAT 함수의 SQL 서버 당량 [중복] (0) | 2020.06.17 |