字符截取

scxs 2017-08-26 10:53:55
1,str字段, 如果该字段有2个*号,1个+号 例: 2050640*10+2050641*500

要截取后结为2条记录为:
id shl
2050640 10
2050641 500


2,如果该字段有3个*号,2个+号 例: 2050640*10+2050641*500+2050642*250
要截取后结为3条记录:
id shl
2050640 10
2050641 500
2050642 250
...全文
133 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
BiChangQing 2017-09-21
  • 打赏
  • 举报
回复
收藏………………
scxs 2017-08-26
  • 打赏
  • 举报
回复
引用 5 楼 scxs 的回复:
[quote=引用 4 楼 sinat_28984567 的回复:] 这样?
--测试数据
if not object_id(N'Tempdb..#T') is null
	drop table #T
Go
Create table #T([col] nvarchar(54))
Insert #T
select N'2050640*10+2050641*500' union all
select N'2050640*10+2050641*500+2050642*250'
Go
--测试数据结束
SELECT  t.*
FROM    #T
        CROSS APPLY ( SELECT    SUBSTRING(f1, 1, CHARINDEX('*', f1) - 1) AS id ,
                                SUBSTRING(f1, CHARINDEX('*', f1) + 1,
                                          LEN(f1) - CHARINDEX('*', f1)) AS shl
                      FROM      dbo.f_splitstr(col, '+')
                    ) t
消息 321,级别 15,状态 1,第 6 行 col 不是可识别的表提示选项。如果它要作为表值函数或 CHANGETABLE 函数的参数,请确保您的数据库兼容模式设置为 90。[/quote]---复制错了,不好意思, 现在得出的结果是这样 2050640*9+2050640*500 2050640*9+2050640*500 2050640*50+2050640*500 2050640*50+2050640*500
scxs 2017-08-26
  • 打赏
  • 举报
回复
引用 4 楼 sinat_28984567 的回复:
这样?
--测试数据
if not object_id(N'Tempdb..#T') is null
	drop table #T
Go
Create table #T([col] nvarchar(54))
Insert #T
select N'2050640*10+2050641*500' union all
select N'2050640*10+2050641*500+2050642*250'
Go
--测试数据结束
SELECT  t.*
FROM    #T
        CROSS APPLY ( SELECT    SUBSTRING(f1, 1, CHARINDEX('*', f1) - 1) AS id ,
                                SUBSTRING(f1, CHARINDEX('*', f1) + 1,
                                          LEN(f1) - CHARINDEX('*', f1)) AS shl
                      FROM      dbo.f_splitstr(col, '+')
                    ) t
消息 321,级别 15,状态 1,第 6 行 col 不是可识别的表提示选项。如果它要作为表值函数或 CHANGETABLE 函数的参数,请确保您的数据库兼容模式设置为 90。
二月十六 2017-08-26
  • 打赏
  • 举报
回复
这样?
--测试数据
if not object_id(N'Tempdb..#T') is null
drop table #T
Go
Create table #T([col] nvarchar(54))
Insert #T
select N'2050640*10+2050641*500' union all
select N'2050640*10+2050641*500+2050642*250'
Go
--测试数据结束
SELECT t.*
FROM #T
CROSS APPLY ( SELECT SUBSTRING(f1, 1, CHARINDEX('*', f1) - 1) AS id ,
SUBSTRING(f1, CHARINDEX('*', f1) + 1,
LEN(f1) - CHARINDEX('*', f1)) AS shl
FROM dbo.f_splitstr(col, '+')
) t


scxs 2017-08-26
  • 打赏
  • 举报
回复
引用 1 楼 sinat_28984567 的回复:
新建函数:
CREATE FUNCTION dbo.f_splitstr(@SourceSql   NVARCHAR(MAX),@StrSeprate   VARCHAR(100))   
  RETURNS   @temp   TABLE(F1   VARCHAR(100))   
  AS     
  BEGIN   
  DECLARE   @ch   AS   VARCHAR(100)   
  SET   @SourceSql=@SourceSql+@StrSeprate     
  WHILE(@SourceSql<>'')   
                  BEGIN   
                  SET   @ch=LEFT(@SourceSql,CHARINDEX(@StrSeprate,@SourceSql,1)-1)   
  INSERT   @temp   VALUES(@ch)   
  SET   @SourceSql=STUFF(@SourceSql,1,CHARINDEX(@StrSeprate,@SourceSql,1),'')   
                  END   
  RETURN   
  END
GO
DECLARE @str NVARCHAR(MAX)= '2050640*10+2050641*500+2050642*250'
SELECT  SUBSTRING(f1, 1, CHARINDEX('*', f1) - 1) AS id ,
        SUBSTRING(f1, CHARINDEX('*', f1) + 1, LEN(f1) - CHARINDEX('*', f1)) AS shl
FROM    dbo.f_splitstr(@str, '+')
DECLARE @str NVARCHAR(MAX)= '2050640*10+2050641*500+2050642*250' 这个值读表记录总是提示没定义标的变量
中国风 2017-08-26
  • 打赏
  • 举报
回复
e.g.
DECLARE @str VARCHAR(1000)='2050640*10+2050641*500+2050642*250'

SELECT T3.*
FROM (VALUES(CONVERT(XML,'<r><c>'+REPLACE('<col>'+REPLACE(@str,'*','</col><col>')+'</col>','+','</col></c><c><col>')+'</c></r>')))T(C)
CROSS APPLY(SELECT T2.C.value('col[1]','int'),T2.C.value('col[2]','int') FROM T.C.nodes('r/c') AS T2(C)) AS T3(Col1,Col2)

/*
Col1	Col2
2050640	10
2050641	500
2050642	250
*/
二月十六 2017-08-26
  • 打赏
  • 举报
回复
新建函数:
CREATE FUNCTION dbo.f_splitstr(@SourceSql   NVARCHAR(MAX),@StrSeprate   VARCHAR(100))   
RETURNS @temp TABLE(F1 VARCHAR(100))
AS
BEGIN
DECLARE @ch AS VARCHAR(100)
SET @SourceSql=@SourceSql+@StrSeprate
WHILE(@SourceSql<>'')
BEGIN
SET @ch=LEFT(@SourceSql,CHARINDEX(@StrSeprate,@SourceSql,1)-1)
INSERT @temp VALUES(@ch)
SET @SourceSql=STUFF(@SourceSql,1,CHARINDEX(@StrSeprate,@SourceSql,1),'')
END
RETURN
END
GO


DECLARE @str NVARCHAR(MAX)= '2050640*10+2050641*500+2050642*250'
SELECT SUBSTRING(f1, 1, CHARINDEX('*', f1) - 1) AS id ,
SUBSTRING(f1, CHARINDEX('*', f1) + 1, LEN(f1) - CHARINDEX('*', f1)) AS shl
FROM dbo.f_splitstr(@str, '+')


二月十六 2017-08-26
  • 打赏
  • 举报
回复
不是select col是select t.*
if not object_id(N'Tempdb..#T') is null
    drop table #T
Go
Create table #T([col] nvarchar(54))
Insert #T
select N'2050640*10+2050641*500' union all
select N'2050640*9+2050641*50+2050642*250'
Go
--测试数据结束
SELECT  t.*
FROM   #t
        CROSS APPLY ( SELECT    SUBSTRING(f1, 1, CHARINDEX('*', f1) - 1) AS id ,
                                SUBSTRING(f1, CHARINDEX('*', f1) + 1,
                                          LEN(f1) - CHARINDEX('*', f1)) AS shl
                      FROM      dbo.f_splitstr(col, '+')
                    ) t
scxs 2017-08-26
  • 打赏
  • 举报
回复
引用 8 楼 scxs 的回复:
[quote=引用 7 楼 sinat_28984567 的回复:] [quote=引用 6楼我是你的主体 的回复:][quote=引用 5 楼 scxs 的回复:] [quote=引用 4 楼 sinat_28984567 的回复:] 这样?
--测试数据
if not object_id(N'Tempdb..#T') is null
	drop table #T
Go
Create table #T([col] nvarchar(54))
Insert #T
select N'2050640*10+2050641*500' union all
select N'2050640*10+2050641*500+2050642*250'
Go
--测试数据结束
SELECT  t.*
FROM    #T
        CROSS APPLY ( SELECT    SUBSTRING(f1, 1, CHARINDEX('*', f1) - 1) AS id ,
                                SUBSTRING(f1, CHARINDEX('*', f1) + 1,
                                          LEN(f1) - CHARINDEX('*', f1)) AS shl
                      FROM      dbo.f_splitstr(col, '+')
                    ) t
消息 321,级别 15,状态 1,第 6 行 col 不是可识别的表提示选项。如果它要作为表值函数或 CHANGETABLE 函数的参数,请确保您的数据库兼容模式设置为 90。[/quote]---复制错了,不好意思, 现在得出的结果是这样 2050640*9+2050640*500 2050640*9+2050640*500 2050640*50+2050640*500 2050640*50+2050640*500[/quote]原来的数据什么样?[/quote] 从一个表中读取的一个字段,样式如 2050640*10+2050641*500 2050640*9+2050641*50+2050642*250[/quote] if not object_id(N'Tempdb..#T') is null drop table #T Go Create table #T([col] nvarchar(54)) Insert #T select N'2050640*10+2050641*500' union all select N'2050640*9+2050641*50+2050642*250' Go --测试数据结束 SELECT col FROM #t CROSS APPLY ( SELECT SUBSTRING(f1, 1, CHARINDEX('*', f1) - 1) AS id , SUBSTRING(f1, CHARINDEX('*', f1) + 1, LEN(f1) - CHARINDEX('*', f1)) AS shl FROM dbo.f_splitstr(col, '+') ) t 现在结果也是这样 col 2050640*10+2050641*500 2050640*10+2050641*500 2050640*9+2050641*50+2050642*250 2050640*9+2050641*50+2050642*250 2050640*9+2050641*50+2050642*250
scxs 2017-08-26
  • 打赏
  • 举报
回复
引用 7 楼 sinat_28984567 的回复:
[quote=引用 6楼我是你的主体 的回复:][quote=引用 5 楼 scxs 的回复:] [quote=引用 4 楼 sinat_28984567 的回复:] 这样?
--测试数据
if not object_id(N'Tempdb..#T') is null
	drop table #T
Go
Create table #T([col] nvarchar(54))
Insert #T
select N'2050640*10+2050641*500' union all
select N'2050640*10+2050641*500+2050642*250'
Go
--测试数据结束
SELECT  t.*
FROM    #T
        CROSS APPLY ( SELECT    SUBSTRING(f1, 1, CHARINDEX('*', f1) - 1) AS id ,
                                SUBSTRING(f1, CHARINDEX('*', f1) + 1,
                                          LEN(f1) - CHARINDEX('*', f1)) AS shl
                      FROM      dbo.f_splitstr(col, '+')
                    ) t
消息 321,级别 15,状态 1,第 6 行 col 不是可识别的表提示选项。如果它要作为表值函数或 CHANGETABLE 函数的参数,请确保您的数据库兼容模式设置为 90。[/quote]---复制错了,不好意思, 现在得出的结果是这样 2050640*9+2050640*500 2050640*9+2050640*500 2050640*50+2050640*500 2050640*50+2050640*500[/quote]原来的数据什么样?[/quote] 从一个表中读取的一个字段,样式如 2050640*10+2050641*500 2050640*9+2050641*50+2050642*250
二月十六 2017-08-26
  • 打赏
  • 举报
回复
引用 6楼我是你的主体 的回复:
[quote=引用 5 楼 scxs 的回复:] [quote=引用 4 楼 sinat_28984567 的回复:] 这样?
--测试数据
if not object_id(N'Tempdb..#T') is null
	drop table #T
Go
Create table #T([col] nvarchar(54))
Insert #T
select N'2050640*10+2050641*500' union all
select N'2050640*10+2050641*500+2050642*250'
Go
--测试数据结束
SELECT  t.*
FROM    #T
        CROSS APPLY ( SELECT    SUBSTRING(f1, 1, CHARINDEX('*', f1) - 1) AS id ,
                                SUBSTRING(f1, CHARINDEX('*', f1) + 1,
                                          LEN(f1) - CHARINDEX('*', f1)) AS shl
                      FROM      dbo.f_splitstr(col, '+')
                    ) t
消息 321,级别 15,状态 1,第 6 行 col 不是可识别的表提示选项。如果它要作为表值函数或 CHANGETABLE 函数的参数,请确保您的数据库兼容模式设置为 90。[/quote]---复制错了,不好意思, 现在得出的结果是这样 2050640*9+2050640*500 2050640*9+2050640*500 2050640*50+2050640*500 2050640*50+2050640*500[/quote]原来的数据什么样?

27,580

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 应用实例
社区管理员
  • 应用实例社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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