100分求助,帮忙看下

sleepzzzzz 2011-03-22 12:25:40
create table test (chr varchar(1000))



insert into test values(
'123456789序号 急诊医学科243986程里 015902ZZZZZZZZZZZZZZZ一般物理降温 次 ')

insert into test values(
'123456789 急诊医学科243986程里 000108X00041650100010注射用头孢西丁钠 支 ')




想得到的查询结果为多列:
123456789序号 ,急诊医学科,243986程里 ,015902ZZZZZZZZZZZZZZZ,一般物理降温 ,次
123456789 ,急诊医学科243986程里 ,000108X00041650100010,注射用头孢西丁钠 ,支


注意:中文的字数不定


...全文
205 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
sleepzzzzz 2011-03-31
  • 打赏
  • 举报
回复
只想通SQL层面去实现,觉得还是行不通。结帖了,给平均分,谢谢。
boli_wu 2011-03-27
  • 打赏
  • 举报
回复
需求要写清楚
boli_wu 2011-03-27
  • 打赏
  • 举报
回复

原数据:
'123456789序号 急诊医学科243986程里 015902ZZZZZZZZZZZZZZZ一般物理降温 次 ')

'123456789 急诊医学科243986程里 000108X00041650100010注射用头孢西丁钠 支 ')
需求数据:
123456789序号 ,急诊医学科,243986程里 ,015902ZZZZZZZZZZZZZZZ,一般物理降温 ,次
123456789 ,急诊医学科243986程里 ,000108X00041650100010,注射用头孢西丁钠 ,支
第一行:急诊医学科,243986程里
第二行:急诊医学科243986程里
这个程序是分不开了,其它了可以按要求显示
迷失的空间 2011-03-26
  • 打赏
  • 举报
回复
把表设计成这个样子,到处有高人啊。。。
不服不行。。。。。
结合9楼的方式,这个是第一步。
第二步就是处理015902ZZZZZZZZZZZZZZZ,拆成两列前6位是一列,后面的是一列。
理想结果如下:
015902,ZZZZZZZZZZZZZZZ
这个不复杂,我就不献丑写code了,楼下的兄弟,加油。。。。。
zheninchangjiang 2011-03-22
  • 打赏
  • 举报
回复
一,连续执行把两个空格置换为一个空格,到最终把空格置为,
你就可以象那样兄弟那样用了
二,执行完后,关于第三列,你的是有规律的

其实excel最好处理了
你的结果,就连规则都没有,第一行6列,第二行5列,灰机搞大了
123456789序号 ,急诊医学科,243986程里 ,015902ZZZZZZZZZZZZZZZ,一般物理降温 ,次
123456789 ,急诊医学科243986程里 ,000108X00041650100010,注射用头孢西丁钠 ,支
XiangZhiLiu 2011-03-22
  • 打赏
  • 举报
回复
在插入新的数据的时候就用特殊的字符隔开就好办了!!!比如“___“弄的特殊一点。总不会有重复的!~~
sleepzzzzz 2011-03-22
  • 打赏
  • 举报
回复
麻烦你们了,解决的话,追加100分。
sleepzzzzz 2011-03-22
  • 打赏
  • 举报
回复
查询得到的结果,像ULtraEdit里列模式的效果,麻烦把insert这两句放在SQL窗口里看看,就知道我想要的东东了。:)
sleepzzzzz 2011-03-22
  • 打赏
  • 举报
回复
楼上的老大,我要求得到的是答案,没时间研究,不要给你帖列子了,谢谢啊。。。
  • 打赏
  • 举报
回复
分拆数据到列

declare @t table (col varchar(50))
insert into @t
select 'aa,bb,bb' union all
select 'AAA,BBB' union all
select 'AAA'
drop table #t
declare @i int,@s varchar(1000)
set @i=0
select col into #t from @t
while @@rowcount>0
begin
set @i=@i+1
set @s='alter table #t add col'+cast(@i as varchar)+' varchar(100)'
exec(@s)
set @s='update #t set col'+cast(@i as varchar)+'=left(col,charindex('','',col+'','')-1),
col=stuff(col,1,charindex('','',col+'',''),'''')
where col>'''''
print @s
exec(@s)
end
select * from #t
sleepzzzzz 2011-03-22
  • 打赏
  • 举报
回复
上面的排版没显示出来,即分割出来的结果,要求是对齐的。
Xiao_Ai_Mei 2011-03-22
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 sleepzzzzz 的回复:]
不理想,不是按空格分割的。有可能是两列在原串里是连接在一起的。
比如:015902ZZZZZZZZZZZZZZZ一般物理降温,这一段就没有被分成两列。

数据本身已经是被存在DB中的,现在需要分割开来。

7楼明白我的意思。
[/Quote]那要把所有可能的情况都说出来。

这个,得有个统一的分隔标志,不然电脑是识别不了的
sleepzzzzz 2011-03-22
  • 打赏
  • 举报
回复
不理想,不是按空格分割的。有可能是两列在原串里是连接在一起的。
比如:015902ZZZZZZZZZZZZZZZ一般物理降温,这一段就没有被分成两列。

数据本身已经是被存在DB中的,现在需要分割开来。

7楼明白我的意思。
gogodiy 2011-03-22
  • 打赏
  • 举报
回复
还是建议你最初建表的时候就把这些数据分开输入,反正查询的时候可以拼起来。
gw6328 2011-03-22
  • 打赏
  • 举报
回复

select dbo.f_t(chr,',') from test;

alter function f_t(@v varchar(1000),@split char(1))
returns varchar(1000)
as
begin
declare @ret varchar(1000);
declare @i int;
declare @ts varchar(100);
set @ret='';
set @v=LTRIM(@v)+' ';

while LEN(@v)>0
begin
set @i=PATINDEX ('%[ ]%',@v);
set @ts=LEFT(@v,@i);
set @ret+=@split+@ts;
set @v=RIGHT(@v,LEN(@v)-@i+1);
set @v=ltrim(@v);
end
return @ret;
end

/*
----------------------------------------------------------------------------
,123456789序号 ,急诊医学科243986程里 ,015902ZZZZZZZZZZZZZZZ一般物理降温 ,次
,123456789 ,急诊医学科243986程里 ,000108X00041650100010注射用头孢西丁钠 ,支

*/
快溜 2011-03-22
  • 打赏
  • 举报
回复
create table test (f_getstr(chr) varchar(1000))
insert into test values(
'123456789序号 急诊医学科243986程里 015902ZZZZZZZZZZZZZZZ一般物理降温 次 ')

insert into test values(
'123456789 急诊医学科243986程里 000108X00041650100010注射用头孢西丁钠 支 ')
create function f_getstr(@str varchar(1000))
returns varchar(1000)
begin
declare @str1 varchar(1000)
set @str1=''
set @str=rtrim(ltrim(@str))
while charindex(' ',@str)>0
begin
set @str1=@str1+'.'+left(@str,charindex(' ',@str)-1)
set @str=ltrim(right(@str,len(@str)-charindex(' ',@str)))
end
return stuff(@str1,1,1,' ')+'.'+@str
end




select parsename(dbo.f_getstr(chr),4) as a,parsename(dbo.f_getstr(chr),3) as b,
parsename(dbo.f_getstr(chr),2) as c,parsename(dbo.f_getstr(chr),1) as d
from test

drop function f_getstr

/*
a b c d
--------------- --------------------------- ----------------------------------------------- --------------
123456789序号 急诊医学科243986程里 015902ZZZZZZZZZZZZZZZ一般物理降温 次
123456789 急诊医学科243986程里 000108X00041650100010注射用头孢西丁钠 支

22,209

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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