SQL 字符串拆分成一张表

阿狸Ahri 2015-06-09 01:11:24
需求: 用户A 选择了日期 2015-01-01和2015-01-02,以及填写了价格200. 那么数据库应该有两条记录,分别是
A 2015-01-01 200
A 2015-01-02 200
也就是一个日期一条数据。

实际数据
'87349+2015-06-10 10:38_2015-06-23 10:38+20.00
$109603+2015-06-16 10:38_2015-06-22 10:38+0.00'

这个是后台传过来的一串数据,现在要根据这个拆分,组合成四条数据
其中' $'分隔了两个用户的数据,而每个用户里面用"+"分隔了 这个用户的信息 如87349+2015-06-10 10:38_2015-06-23 10:38+20.00表示用户ID 是87349,日期有2015-06-10 10:38_2015-06-23 10:38,价格是20.00
然而,日期中又用"_"分隔,也就是说87349 有两个日期。
按照这字符串拆分应该有四条数据

87349 2015-06-10 10:38 20.00
87349 2015-06-23 10:38 20.00
109603 2015-06-16 10:38 0.00
109603 2015-06-22 10:38 0.00

现在提供两个函数
fn_GetSplitStr(str,split,len) 需要拆分的字符串str,根据split字符拆分,取拆分后的第len个值。返回一个值
fn_StrSplitToTable(str,split) 需要拆分的字符串str,根据split字符拆分,返回一张表
但是这两个函数都是只有一个字段而已,上面的直接返回一个字符串,后面一个仅仅一个拆分后的字段。

我现在不懂怎么连表。



;WITH act AS (
SELECT dbo.fn_GetSplitStr(fs.cValue, '+', 1) stuID,
dbo.fn_GetSplitStr(fs.cValue, '+', 2) dateList,
dbo.fn_GetSplitStr(fs.cValue, '+', 3) FeeStand
FROM dbo.fn_StrSplitToTable(@SelInfo,' $') AS fs )
SELECT * FROM act

我做到这一步了,下面的怎么把剩下的拆出来我弄不出来
...全文
269 6 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
苦苦的潜行者 2015-06-09
  • 打赏
  • 举报
回复
引用 4 楼 ky_min 的回复:
DECLARE @STRIN VARCHAR(MAX)
SET @STRIN='87349+2015-06-10 10:38_2015-06-23 10:38+20.00
                 $109603+2015-06-16 10:38_2015-06-22 10:38+0.00'
;WITH CTE AS(
	SELECT RTRIM(T2.V)V,CHARINDEX('+',T2.V)N1
		,CHARINDEX('_',T2.V)N2
		,CHARINDEX('+',T2.V,CHARINDEX('+',T2.V)+1)N3
	FROM(SELECT CAST('<V>'+REPLACE(@STRIN,'$','</V><V>')+'</V>'AS XML)VS)T1
		CROSS APPLY(SELECT N.V.value('.','VARCHAR(100)')V FROM T1.VS.nodes('/V')N(V))T2
)
,CTE2 AS(
SELECT LEFT(V,N1-1)AS[stuID]
	,SUBSTRING(V,N1+1,N2-N1-1)[date1]
	,SUBSTRING(V,N2+1,N3-N2-1)[date2]
	,RIGHT(V,LEN(V)-N3)[FeeStand]
FROM CTE
)
SELECT [stuID],[date],[FeeStand]
FROM CTE2 UNPIVOT([date] FOR T IN([date1],[date2]))U
好腻害。。。
苦苦的潜行者 2015-06-09
  • 打赏
  • 举报
回复
如果能用正则会比较好一些。可惜 mssql不支持。。


\$?(\d+)\+([^_]+)_([^\+]+)\+([^$]+)

/*
87349+2015-06-10 10:38_2015-06-23 10:38+20.00$109603+2015-06-16 10:38_2015-06-22 10:38+0.00
Group 1	Group 2	Group 3	Group 4
87349	2015-6-10 10:38	2015-6-23 10:38	20.00 
109603	2015-6-16 10:38	2015-6-22 10:38	0.00 
*/
还在加载中灬 2015-06-09
  • 打赏
  • 举报
回复
DECLARE @STRIN VARCHAR(MAX)
SET @STRIN='87349+2015-06-10 10:38_2015-06-23 10:38+20.00
$109603+2015-06-16 10:38_2015-06-22 10:38+0.00'
;WITH CTE AS(
SELECT RTRIM(T2.V)V,CHARINDEX('+',T2.V)N1
,CHARINDEX('_',T2.V)N2
,CHARINDEX('+',T2.V,CHARINDEX('+',T2.V)+1)N3
FROM(SELECT CAST('<V>'+REPLACE(@STRIN,'$','</V><V>')+'</V>'AS XML)VS)T1
CROSS APPLY(SELECT N.V.value('.','VARCHAR(100)')V FROM T1.VS.nodes('/V')N(V))T2
)
,CTE2 AS(
SELECT LEFT(V,N1-1)AS[stuID]
,SUBSTRING(V,N1+1,N2-N1-1)[date1]
,SUBSTRING(V,N2+1,N3-N2-1)[date2]
,RIGHT(V,LEN(V)-N3)[FeeStand]
FROM CTE
)
SELECT [stuID],[date],[FeeStand]
FROM CTE2 UNPIVOT([date] FOR T IN([date1],[date2]))U
阿狸Ahri 2015-06-09
  • 打赏
  • 举报
回复
如果能直接表链接的就直接表链接, 尽量不要使用游标,或者循环。 我一些循环,十有八九被骂
阿狸Ahri 2015-06-09
  • 打赏
  • 举报
回复
引用 1 楼 Cherise_huang 的回复:
如果是拆分字符串到临时表

Create function [dbo].[split]
(
@SourceSql varchar(max),
@StrSeprate varchar(10)
)
returns @temp table(line varchar(max))
as
begin
    declare @i int
    set @SourceSql = rtrim(ltrim(@SourceSql))
    set @i = charindex(@StrSeprate,@SourceSql)
    while @i >= 1
    begin
        if len(left(@SourceSql,@i-1))>0
        begin
            insert @temp values(left(@SourceSql,@i-1))
        end
        set @SourceSql=substring(@SourceSql,@i+len(@StrSeprate),len(@SourceSql)-@i)
        set @i=charindex(@StrSeprate,@SourceSql)
    end
    if @SourceSql <> ''
        insert @temp values(@SourceSql)
    return
end
我上面提供有 字符串拆分函数
Cherise_huang 2015-06-09
  • 打赏
  • 举报
回复
如果是拆分字符串到临时表

Create function [dbo].[split]
(
@SourceSql varchar(max),
@StrSeprate varchar(10)
)
returns @temp table(line varchar(max))
as
begin
    declare @i int
    set @SourceSql = rtrim(ltrim(@SourceSql))
    set @i = charindex(@StrSeprate,@SourceSql)
    while @i >= 1
    begin
        if len(left(@SourceSql,@i-1))>0
        begin
            insert @temp values(left(@SourceSql,@i-1))
        end
        set @SourceSql=substring(@SourceSql,@i+len(@StrSeprate),len(@SourceSql)-@i)
        set @i=charindex(@StrSeprate,@SourceSql)
    end
    if @SourceSql <> ''
        insert @temp values(@SourceSql)
    return
end

34,837

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧