【问题标题】:split function comma separator SQL Server拆分函数逗号分隔符 SQL Server
【发布时间】:2015-04-05 00:39:08
【问题描述】:

我想用给定的输入字符串将函数拆分成两个单独的列。

如果我执行这个函数,我会得到像

这样的行值列表
select * 
from dbo.Split ('sunday,9,monday,8,tuesday,9, wednesday 8, thursday 8,friday,9, saturday,8')

类似行值的输出

sunday 
9
monday
8
tuesday
9
wednesday
8 
thursday
8 
friday
9
saturday 
8

我的分割函数是:

create  function dbo.Split
(
    @String varchar(max)
)
returns @SplittedValues table
(
    Id varchar(50)  
)
as
begin
    declare @SplitLength int, @Delimiter varchar(5)

    set @Delimiter = ','

    while len(@String) > 0
    begin 
        select @SplitLength = (case charindex(@Delimiter,@String) when 0 then
            len(@String) else charindex(@Delimiter,@String) -1 end)

        insert into @SplittedValues
        select substring(@String,1,@SplitLength) 

        select @String = (case (len(@String) - @SplitLength) when 0 then  ''
            else right(@String, len(@String) - @SplitLength - 1) end)
    end 
return  
end

但我需要两列天(第一个参数的天数列表),小时,

+-----------+-------+
|   Days    | Hours |
+-----------+-------+
| Sunday    |    9  |
| Monday    |    8  |
| Tuesday   |    9  |
| Wednesday |    8  |
| Thursday  |    8  |
| Friday    |    9  |
| saturday  |    8  |
+-----------+-------+

我该如何解决这个问题?

【问题讨论】:

标签: sql-server function split


【解决方案1】:

@user3442289 你也可以使用下面的代码。我刚刚更改了您代码中的一些语句。

create  function dbo.Split2
(
    @String varchar(max)
)
returns @SplittedValues table
(
    Id varchar(50)  ,
    Id1 int
)

begin
    declare @SplitLength int, @Delimiter varchar(5)

    set @Delimiter = ','

    while len(@String) > 0
    begin 
        select @SplitLength = (case charindex(@Delimiter,@String) when 0 then
            len(@String) else charindex(@Delimiter,@String)  end)

        insert into @SplittedValues
        select substring(@String,1,@SplitLength-1) ,SUBSTRING(@string,@SplitLength+1,1)

                select @String = (case (len(@String) - @SplitLength) when 0 then  ''
            else right(@String, len(@String) - @SplitLength-1) end)

            if @string<>'' 
            begin
            set @string=(select substring(@string,2,len(@string)))
            end

    end 
    return
end

【讨论】:

  • 嘿,这比我的策略更好:)
【解决方案2】:

可能有更漂亮的方法来做到这一点。

create  function dbo.TwoColumnSplit
(
    @String varchar(max)
)
returns @returnTable table
(
    LeftId varchar(50)
    , RightId varchar(50)  
)
as
begin

declare @numCols int = 2
declare @itr int = 0
declare @SplittedValues table
(
    rowID int,
    colID int,
    Id varchar(50)  

)
    declare @SplitLength int, @Delimiter varchar(5)

    set @Delimiter = ','

    while len(@String) > 0
    begin 
        select @SplitLength = (case charindex(@Delimiter,@String) when 0 then
            len(@String) else charindex(@Delimiter,@String) -1 end)

        insert into @SplittedValues(rowID, colID, Id)
        select @itr / @numCols, @itr % @numCols, substring(@String,1,@SplitLength) 

        select @String = (case (len(@String) - @SplitLength) when 0 then  ''
            else right(@String, len(@String) - @SplitLength - 1) end)

        set @itr = @itr + 1
    end 

insert into @returnTable(LeftId, RightId)
select l.id as LeftId, r.id as RightId
from
(select rowid, id from @SplittedValues where colid = 0) l
join
(select rowid, id from @SplittedValues where colid = 1) r
on l.rowid = r.rowID

return
END

go

select * from  [dbo].[TwoColumnSplit]('sunday,9,monday,8,tuesday,9, wednesday, 8, thursday, 8,friday,9, saturday,8')

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-17
  • 2013-10-05
  • 2015-03-07
  • 2018-12-21
相关资源
最近更新 更多