SQL语句

fpzgm 2010-09-21 02:43:42
现有一字符串字段:str,内容格式为“#文字###文字##文字#####……”
其中#个数不定,结尾可能以#结束也可能以文字结束

查询要求: 将此字段拆分成N个字段
格式为: 第一串连续#个数 第一串#后文字 第二串#连续个数 第二串#后文字 ……
方法越简单越好
盼复!
...全文
193 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
闹铃 2010-09-28
  • 打赏
  • 举报
回复

---参考这个题 思路

use tempdb;

create function fn_test
(@str nvarchar(max))
returns @sql table
(
textnet nvarchar(6),
tcontext nvarchar(max)
)
as
begin
set @str=replace(@str,char(10),'-')+N'-';
declare @n int;
set @n=len(@str);
while @n<>0
begin
insert into @sql
select SUBSTRING(@str,CHARINDEX(')',@str)+1,CHARINDEX(':',@str)-CHARINDEX(')',@str)-1),
SUBSTRING(@str,CHARINDEX(':',@str)+1,CHARINDEX('-',@str)-CHARINDEX(':',@str)-1);
set @str=right(@str,@n-charindex('-',@str));
set @n=len(@str);
end
return;
end
go

create table dbo.test
(
id int,
textnet nvarchar(max)
);
insert into dbo.test
select 60000,
N'(1)方大集团入主:债权人葫芦岛市商业银行站前支行
(2)辽宁方大:目前辽宁方大下属产业主要分布于四大业务板块
(3)破产重整:公司2010年4月21日起进入重整程序
(4)化工企业:公司是以基础化工生产为主的老工业基地
(5)TDI项目:公司与中国兵器工业集团公司下属北京高科公司共同出资。'
union all
select 70000,
N'(1)方大集团入主:债权人葫芦岛市商业银行站前支行
(2)辽宁方大:目前辽宁方大下属产业主要分布于四大业务板块
(3)破产重整:公司2010年4月21日起进入重整程序
(4)化工企业:公司是以基础化工生产为主的老工业基地
(5)TDI项目:公司与中国兵器工业集团公司下属北京高科公司共同出资。';

select id,yy.textnet,yy.tcontext
from dbo.test as xx
cross apply (select *
from dbo.fn_test(xx.textnet))as yy;

结果
id textnet      tcontext
---- ------    -----------
60000 方大集团入主    债权人葫芦岛市商业银行站前支行
60000 辽宁方大      目前辽宁方大下属产业主要分布于四大业务板块
60000 破产重整      公司2010年4月21日起进入重整程序
60000 化工企业      公司是以基础化工生产为主的老工业基地
60000 TDI项目      公司与中国兵器工业集团公司下属北京高科公司共同出资。
70000 方大集团入主 债权人葫芦岛市商业银行站前支行
70000 辽宁方大      目前辽宁方大下属产业主要分布于四大业务板块
70000 破产重整      公司2010年4月21日起进入重整程序
70000 化工企业      公司是以基础化工生产为主的老工业基地
70000 TDI项目      公司与中国兵器工业集团公司下属北京高科公司共同出资。



闹铃 2010-09-26
  • 打赏
  • 举报
回复

create function fun_str
(@str varchar(100))
returns varchar(100)
as
begin
declare strcur cursor for
select COUNT(number)as row1
from (select number,ROW_NUMBER()over(order by number)as row
from master..spt_values
where type='p'
and substring(@str,number,1)='#')as t
group by (number-row)
order by row1 desc;
open strcur;
declare @n int;
fetch next from strcur into @n;
while @@FETCH_STATUS=0
begin
set @str=REPLACE(@str,REPLICATE('#',@n),@n);
fetch next from strcur into @n;
end
close strcur;
deallocate strcur;
return @str;
end
go

select dbo.fun_str('#文字###文字##文字#####')as str1,
dbo.fun_str('文字###文字##文字#####文字')as str2,
dbo.fun_str('文字######文字')as str3,
dbo.fun_str('#####')as str4
/**
str1 str2 str3 str4
--------------- ------------------ -------- --
1文字3文字2文字5 文字3文字2文字5文字 文字6文字 5
**/
--原来是这样发的(第一次源代码格式回复)
闹铃 2010-09-26
  • 打赏
  • 举报
回复

create function fun_str
(@str varchar(100))
returns varchar(100)
as
begin
declare strcur cursor for
select COUNT(number)as row1
from (select number,ROW_NUMBER()over(order by number)as row
 from master..spt_values
 where type='p'
 and substring(@str,number,1)='#')as t
group by (number-row)
order by row1 desc;
open strcur;
declare @n int;
fetch next from strcur into @n;
while @@FETCH_STATUS=0
begin
set @str=REPLACE(@str,REPLICATE('#',@n),@n);
fetch next from strcur into @n;
end
close strcur;
deallocate strcur;
return @str;
end
go

select dbo.fun_str('#文字###文字##文字#####')as str1,
dbo.fun_str('文字###文字##文字#####文字')as str2,
dbo.fun_str('文字######文字')as str3,
dbo.fun_str('#####')as str4
闹铃 2010-09-26
  • 打赏
  • 举报
回复
create function fun_str
(@str varchar(100))
returns varchar(100)
as
begin
declare strcur cursor for
select COUNT(number)as row1
from (select number,ROW_NUMBER()over(order by number)as row
from master..spt_values
where type='p'
and substring(@str,number,1)='#')as t
group by (number-row)
order by row1 desc;
open strcur;
declare @n int;
fetch next from strcur into @n;
while @@FETCH_STATUS=0
begin
set @str=REPLACE(@str,REPLICATE('#',@n),@n);
fetch next from strcur into @n;
end
close strcur;
deallocate strcur;
return @str;
end
go

select dbo.fun_str('#文字###文字##文字#####')as str1,
dbo.fun_str('文字###文字##文字#####文字')as str2,
dbo.fun_str('文字######文字')as str3,
dbo.fun_str('#####')as str4

/***
str1 str2 str3 str4
-------------- ----------------- -------- ----
1文字3文字2文字5 文字3文字2文字5文字 文字6文字 5
***/
fpzgm 2010-09-26
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 denghui_li 的回复:]
SQL code

create function fun_str
(@str varchar(100))
returns varchar(100)
as
begin
declare strcur cursor for
select COUNT(number)as row1
from (select number,ROW_NUMBER()over(order by number)……
[/Quote]

要拆分为N个字段
fpzgm 2010-09-26
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 gll062 的回复:]
SQL code

set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
go



-- =============================================
-- Author: <龙在天涯>
-- Create date: <2010-09-22>
-- Description: <拆分字符串,并……
[/Quote]

要拆分为N个字段
fpzgm 2010-09-25
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 happycell188 的回复:]
SQL code
对于 '#文字###文字##文字#####' 楼主想要的结果是下面的么??
col1 col2 col3 col4 col5
-----------------------------------
1 文字 3 文字 2 文字 5
[/Quote]
是的
优雅de程序员 2010-09-25
  • 打赏
  • 举报
回复
看的很郁闷啊!
「已注销」 2010-09-24
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 baifucn 的回复:]

三楼的 你写出来的东东 是不是术语就叫做存储过程啊 我没有学习过 真的很想知道。。。。。。
[/Quote]
是函数。
存储过程是create procedure.....
喜-喜 2010-09-24
  • 打赏
  • 举报
回复
对于 '#文字###文字##文字#####' 楼主想要的结果是下面的么??
col1 col2 col3 col4 col5
-----------------------------------
1 文字 3 文字 2 文字 5
喜-喜 2010-09-24
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 baifucn 的回复:]
三楼的 你写出来的东东 是不是术语就叫做存储过程啊 我没有学习过 真的很想知道。。。。。。
[/Quote]

三楼的是函数
john3747cn 2010-09-24
  • 打赏
  • 举报
回复
帮顶。。。
gll062 2010-09-24
  • 打赏
  • 举报
回复

set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
go



-- =============================================
-- Author: <龙在天涯>
-- Create date: <2010-09-22>
-- Description: <拆分字符串,并得到区分字符串的字符的个数>
--字符串格式:#到了极点###得分偶尔偶尔##发了的肌肤###的决定###### (其中#的个数不确定也无规律,并且字符结尾可以是#也可以是文字)
-- =============================================
ALTER FUNCTION [dbo].[funSplitString]
(
@strString VARCHAR(MAX),@strChar VARCHAR(1)
)
RETURNS VARCHAR(MAX)
AS
BEGIN
DECLARE @i INT;
DECLARE @count INT;
DECLARE @strReturn VARCHAR(MAX);
DECLARE @subString VARCHAR(1000);

SET @subString = '';
SET @strReturn = '';
SET @count = 0;
SET @i = CHARINDEX(@strChar,@strString);
WHILE @i >= 0
BEGIN
IF @i = 1
BEGIN
SET @count = @count + 1;
SET @strString = SUBSTRING(@strString,2,LEN(@strString) - 1);
SET @i = CHARINDEX(@strChar,@strString);
END
ELSE
BEGIN
IF @i = 0
BEGIN
SET @strReturn = @strReturn + CONVERT(VARCHAR(50),@count);
BREAK;
END
SET @subString = SUBSTRING(@strString,1,@i - 1);
SET @strReturn = @strReturn + CONVERT(VARCHAR(50),@count) + @subString;
SET @strString = SUBSTRING(@strString,@i,LEN(@strString) - LEN(@subString));
SET @i = CHARINDEX(@strChar,@strString);
SET @count = 0;
END
END

RETURN @strReturn;
END




wishfulsun 2010-09-24
  • 打赏
  • 举报
回复
学习下·~
baifucn 2010-09-23
  • 打赏
  • 举报
回复
再顶。。。。。。
baifucn 2010-09-23
  • 打赏
  • 举报
回复
多回几次 有奖。。。。。。
baifucn 2010-09-23
  • 打赏
  • 举报
回复
三楼的 你写出来的东东 是不是术语就叫做存储过程啊 我没有学习过 真的很想知道。。。。。。
快乐_石头 2010-09-22
  • 打赏
  • 举报
回复
先将所有##替换成一个#
然后按照#来分割
declare @s varchar(30)
set @s='#文字###文字##文字#####'
while charindex('##',@s)>0
begin
set @s=replace(@s,'##','#')
end
print @s
/*
#文字#文字#文字#*/
「已注销」 2010-09-21
  • 打赏
  • 举报
回复
create function dbo.fn_split(@inputstr varchar(8000), @seprator varchar(10))
returns @temp table (a varchar(200))
as
begin
declare @i int
set @inputstr = rtrim(ltrim(@inputstr))
set @i = charindex(@seprator , @inputstr)
while @i >= 1
begin
insert @temp values(left(@inputstr , @i - 1))
set @inputstr = substring(@inputstr , @i + 1 , len(@inputstr) - @i)
set @i = charindex(@seprator , @inputstr)
end
if @inputstr <> '\'
insert @temp values(@inputstr)
return
end
go

--调用
declare @str as varchar(30)
set @str = 'aaaa#123###1212123##4234343#####'
SELECT T.* FROM DBO.fn_split(@str,'#') T
WHERE LEN(a)>0

a
---------------------
aaaa
123
1212123
4234343

(4 row(s) affected)
SQLCenter 2010-09-21
  • 打赏
  • 举报
回复
真的是太麻烦了,而且两行记录段数不同的情况,拆成几列?
加载更多回复(1)

27,579

社区成员

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

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