如何用sql语句实现特定字符之间的字符提取

如20-45-122-25-1 我想分别提取出20、45、122、25、1,当然不能根据固定长度提,数字的长度不固定,能不能根据“-”字符出现的次数提,如第一个出现的字符前面提出20,第二个字符前面提出45,依次类推,请大侠帮忙了
nomanland的方法不错
declare @s varchar(8000),@sql nvarchar(4000)
set @s='20-45-122-25-1'
set @sql='select '+replace(@s,'-',' col union all select ')
exec(@sql)
不过我希望分开提,比如先提出45, 再提出20,因为他们每组数据都有用,我不希望一下子出来一组数据,请大侠们再帮我想想

对了,能不能用几个函数分别得到20、45、122、25、1,不要复杂,我是在excel中调用,比如像left('20-45-122-25-1',charindex('-','20-45-122-25-1')-1)这样的方式,不过这个不足的是,我的字符串的位置不固定,所以这个不行。

第1个回答  推荐于2016-03-14
好久没有写过SQL了,花了一个小时把你的问题解决了,加20分,快!

CREATE TABLE [#tmp] (
[数字] [varchar] (35) COLLATE Chinese_PRC_CI_AS NULL ,
) ON [PRIMARY]
declare @Len int
set @Len=1
declare @hen int
set @hen=1
while @hen>0
begin
SELECT @hen=CHARINDEX('-', substring('20-45-122-25-1',@Len,Len('20-45-122-25-1' )) )

IF @hen=0 AND CHARINDEX('-',REVERSE('20-45-122-25-1'))>1
BEGIN

insert into #tmp ([数字])
(SELECT REVERSE(SUBSTRING (REVERSE('20-45-122-25-1'),1,CHARINDEX('-',REVERSE('20-45-122-25-1')))))
END
ELSE
insert into #tmp ([数字])
(select substring('20-45-122-25-1',@Len,@hen ))
--select substring(substring('20-45-122-25-1',@Len,Len('20-45-122-25-1' )),1, @hen+1))
set @Len=@Len+@hen

END
select REPLACE([数字],'-','') from #tmp
drop table #tmp本回答被提问者采纳
第2个回答  2008-09-26
你提出来放哪?

mssql2005下测试正常
declare @s varchar(8000),@sql nvarchar(4000)
set @s='20-45-122-25-1'
set @sql='insert into t(col) select '+replace(@s,'-',' col union all select ')
exec(@sql)

参考资料:http://www.diybl.com/course/7_databases/sql/sqlServer/2007106/77000.html

第3个回答  2008-09-26
nomanland的方法不错,直接select楼主就看出效果了。这个应该给他加分啊:)
declare @s varchar(8000),@sql nvarchar(4000)
set @s='20-45-122-25-1'
set @sql='select '+replace(@s,'-',' col union all select ')
exec(@sql)
第4个回答  2008-09-26
傻方法 select left('20-45-122-25-1',charindex('-','20-45-122-25-1')-1)
自己一步一步截取.也可做个函数调用
第5个回答  2008-09-26
你可以先把数据从数据库中度出来,然后在程序中分解,这样要比在数据库中处理简单多了

如何通过SQL截取指定字段某一个字符的前面或后面的字符串?
针对SQL Server的实现:当需截取字符串"OPE-CZ-108-003-SE71.2"中的"."字符前面的字符串时,可以采用如下SQL语句。结果为"OPE-CZ-108-003-SE71",取值范围从字段第一位置开始,至"."字符前一个位置结束。对于截取"."字符后面的字符串,同样使用SQL Server,只需调整SQL语句,从"."字符后一位...

sql 如何截取一个字段里某一字符串中间的字符?
--这个查询需要注意的是qwer后的需要查询的字符串必须是一个空格,不能有的是一个空格有的是两个。也就是格式要固定。--定义参数 create table #a (string varchar(max))declare @sql varchar(max)declare @a varchar(max)select @a ='asdf qwer zxcv 1234 qwer yuchor 3452 qwer abcd 7893'-...

SQL如何提取第某个特定字符前后的字符?
print(s)v = re.findall(r'_.+_.+_(.+)_', s)print("---")print(v)print("===")ABC集团_A店_A楼层_ASD商品部_日化A --- ['ASD商品部']=== ABC集团_AB店_A楼层_ASDF商品部_日化B --- ['ASDF商品部']=== 是不是相要这样的结果。

SQL截取两个特定值之间的文字
Expression1是要到expression2中寻找的字符中,start_location是CHARINDEX函数开始在expression2中找expression1的位置。substring函数调用方法如下:substring(string,startNumber, endNumber)返回第一个参数中从第二个参数指定的位置开始、第三个参数指定的长度的子字符串。例子:CHARINDEX('SQL', 'Microsoft SQ...

如何用SQL 语句截取两个固定字符之间的字符串?
select substring(字符串,1,PATINDEX(<'%字符串%'>,'丘')-1) as 字符1 ,substring(字符串,PATINDEX(<'%字符串%'>,'丘')+1,PATINDEX(<'%字符串%'>,'栋')-PATINDEX(<'%字符串%'>,'丘')+1) as 字符2 from 表名

如何用sql语句实现特定字符之间的字符提取
好久没有写过SQL了,花了一个小时把你的问题解决了,加20分,快!CREATE TABLE [#tmp] ([数字] [varchar] (35) COLLATE Chinese_PRC_CI_AS NULL ,) ON [PRIMARY]declare @Len int set @Len=1 declare @hen int set @hen=1 while @hen>0 begin SELECT @hen=CHARINDEX('-', substring(...

用sql语句怎么获取一句话中某个字符的位置,并把该字符后面的字符全部...
需要以下两个函数:charindex,stuff select charindex('5','1234567890') --结果为:5 select stuff('1234567890',1,charindex('5','1234567890'),'')--结果为:67890

SQL MID()函数如何从文本字段中提取字符?
SQL中的MID()函数是一个强大的工具,它用于从文本字段中截取特定字符。该函数的结构为SELECT MID(column_name, start, [length]) FROM table_name,其中column_name是你想要提取字符的字段,start是你想要开始的位置(从1开始计数),length(可选)则是你希望返回的字符数。如果省略length,MID()函数...

sql中where截取字符串字符
sql中在where字句里截取字符方法如下:1、如果是sqlserver:where left(p.end_time,4) = '2012'。2、如果是Oracle:where substr(p.end_time,0,4) = '2012'。举例:1、oracle: 'where substr(字段名,1,2)='''123'''2、sqlserver: 'where substring(字段名,1,2...

sql语句,如何截取指定字段某一个字符出现后的后面的字符串吗
sql语句可以截取指定字段后面的字符串,以sqlserver为例,需要用到charindex函数和substring函数。如test表中有如下数据,要求截图str字段中逗号后边的内容。可用如下语句:1 select id,substring(str,charindex(',',str)+1,len(str)-charindex(',',str)) from test;结果截图:charindex函数说明:语法:CH...

相似回答