sql中截取字符串"_"前的字符并且最后一位数字-1;

时间:2023-01-04 12:08:58
sql中截取字符串"_"前的字符并且最后一位数字-1;
如有字段caseno ,其值为"1076D67D71_0_10516-13";"16D7D131_0_10516-13";
(注: 第一个"_"前面的字符个数不确定)
我用select REPLACE('1076D67D71_0_10516-13','_0_10516-13','') 截取的值为"1076D67D71";
select REPLACE('16D7D131_0_10516-13','_0_10516-13','') 截取的值为"16D7D131";
我想要的值是这样的"1076D67D70"、 "16D7D130"请问如何让最后一位-1呢???

16 个解决方案

#1


SELECT SUBSTRING(caseno,1,9)+LTRIM((CAST(SUBSTRING(caseno,10,1) AS INT)-1))

好早就答过了 不看 也不去试。

#2


sql中截取字符串"_"前的字符并且最后一位数字-1;别听F妈瞎扯,
刚才那帖子里我写的那么多,LZ居然没明白,太浪费我感情了,还只给我10分。。。

#3


请问如何让最后一位-1呢???

-------------为是0时,怎样显示

#4


这次是REPLACE不是SUBSTRING,还有条件不同

#5


小F的肯定不行,长度都不确定...

#6


2楼的,你的方法是好,可是也要看在那用呀,我用表单做东西呢,你那变量就没法声明的。

#7



DECLARE @Str VARCHAR(100)
SET @Str = '76D67D71_0_10516-13'

SELECT LEFT(@Str,CHARINDEX('_',@Str) - 2) + CAST(CAST(SUBSTRING(@Str,CHARINDEX('_',@Str) - 1,1) AS INT) - 1 AS VARCHAR(10))



但是如果取出的字符串最后一位本身就是0,再-1是多少呢?

#8


引用 2 楼  的回复:
别听F妈瞎扯,
刚才那帖子里我写的那么多,LZ居然没明白,太浪费我感情了,还只给我10分。。。


sql中截取字符串"_"前的字符并且最后一位数字-1;

没看清楚题目。

#9


呵呵,谢谢大家了。
 
magician547 ——以帮我解决问题。

#10


引用 9 楼  的回复:
呵呵,谢谢大家了。
 
magician547 ——以帮我解决问题。


我只想说,LZ你太不严谨了。。。。

#11


引用 5 楼  的回复:
小F的肯定不行,长度都不确定...


如有字段caseno ,其值为"1076D67D71_0_10516-13";"16D7D131_0_10516-13";
从左边看长度是不确定,但是从右边看就有规律了reverse

#12



--建个function
Create Function dbo.usf_test(@s varchar(100))
returns  varchar(100)
as
begin

declare @tmp1 varchar(100),@tmp2 varchar(100), @num int,@re varchar(100)

select @tmp1=left(@s,case when charindex('_',@s)-1 > 0 then charindex('_',@s)-1 else len(@s) end)
,@tmp2= left(reverse(@tmp1), case when patindex('%[^0-9]%',reverse(@tmp1))-1>=0 then patindex('%[^0-9]%',reverse(@tmp1))-1 else len(@tmp1) end)

if isnumeric(right(@tmp2,1))=1 
begin
  if replace(@tmp2,'0','')<>''
   select @num=convert(int,reverse(@tmp2))-1
        ,@re= stuff(@tmp1,len(@tmp1)-len(@tmp2)+1,len(@tmp2),right(replace(space(len(@tmp2)),' ','0')+rtrim(@num),len(@tmp2)))
  else
   select @re=@tmp1
end
else
  select @re=@tmp1

return @re
end

GO

--以后可以直接用。。。
select dbo.usf_test('1078A10D10_0_10516-13')

#13


----------------------------------------------------------------
-- Author  :fredrickhu(小F,向高手学习)
-- Date    :2012-05-25 16:53:19
-- Version:
--      Microsoft SQL Server 2008 R2 (RTM) - 10.50.1617.0 (Intel X86) 
-- Apr 22 2011 11:57:00 
-- Copyright (c) Microsoft Corporation
-- Enterprise Edition on Windows NT 6.1 <X64> (Build 7600: ) (WOW64)
--
----------------------------------------------------------------
--> 测试数据:[tb]
if object_id('[tb]') is not null drop table [tb]
go 
create table [tb]([caseno] varchar(21))
insert [tb]
select '1076D67D71_0_10516-13' union all
select '16D7D131_0_10516-13'
--------------开始查询--------------------------
select *  into #t from(select parsename(replace(caseno,'_','.'),3) as a from tb)t 

--select * from #t

select left(a,len(a)-1)+ltrim(cast(right(a,1) as int)-1) from #t

drop table #t 
----------------结果----------------------------
/* --------------------------------------------------------------------------------------------------------------------------------------------
1076D67D70
16D7D130

(2 行受影响)

*/

#14


引用 12 楼  的回复:
SQL code

--建个function
Create Function dbo.usf_test(@s varchar(100))
returns  varchar(100)
as
begin

declare @tmp1 varchar(100),@tmp2 varchar(100), @num int,@re varchar(100)

select @tmp1=le……

沟沟 你还忙活。  sql中截取字符串"_"前的字符并且最后一位数字-1;

#15


 收藏+学习 ;新手请谅解。 

#16


刚开始时觉得挺简单的,以为就是字符串处理,后来仔细看才发觉要花一番功夫,学习了!

#1


SELECT SUBSTRING(caseno,1,9)+LTRIM((CAST(SUBSTRING(caseno,10,1) AS INT)-1))

好早就答过了 不看 也不去试。

#2


sql中截取字符串"_"前的字符并且最后一位数字-1;别听F妈瞎扯,
刚才那帖子里我写的那么多,LZ居然没明白,太浪费我感情了,还只给我10分。。。

#3


请问如何让最后一位-1呢???

-------------为是0时,怎样显示

#4


这次是REPLACE不是SUBSTRING,还有条件不同

#5


小F的肯定不行,长度都不确定...

#6


2楼的,你的方法是好,可是也要看在那用呀,我用表单做东西呢,你那变量就没法声明的。

#7



DECLARE @Str VARCHAR(100)
SET @Str = '76D67D71_0_10516-13'

SELECT LEFT(@Str,CHARINDEX('_',@Str) - 2) + CAST(CAST(SUBSTRING(@Str,CHARINDEX('_',@Str) - 1,1) AS INT) - 1 AS VARCHAR(10))



但是如果取出的字符串最后一位本身就是0,再-1是多少呢?

#8


引用 2 楼  的回复:
别听F妈瞎扯,
刚才那帖子里我写的那么多,LZ居然没明白,太浪费我感情了,还只给我10分。。。


sql中截取字符串"_"前的字符并且最后一位数字-1;

没看清楚题目。

#9


呵呵,谢谢大家了。
 
magician547 ——以帮我解决问题。

#10


引用 9 楼  的回复:
呵呵,谢谢大家了。
 
magician547 ——以帮我解决问题。


我只想说,LZ你太不严谨了。。。。

#11


引用 5 楼  的回复:
小F的肯定不行,长度都不确定...


如有字段caseno ,其值为"1076D67D71_0_10516-13";"16D7D131_0_10516-13";
从左边看长度是不确定,但是从右边看就有规律了reverse

#12



--建个function
Create Function dbo.usf_test(@s varchar(100))
returns  varchar(100)
as
begin

declare @tmp1 varchar(100),@tmp2 varchar(100), @num int,@re varchar(100)

select @tmp1=left(@s,case when charindex('_',@s)-1 > 0 then charindex('_',@s)-1 else len(@s) end)
,@tmp2= left(reverse(@tmp1), case when patindex('%[^0-9]%',reverse(@tmp1))-1>=0 then patindex('%[^0-9]%',reverse(@tmp1))-1 else len(@tmp1) end)

if isnumeric(right(@tmp2,1))=1 
begin
  if replace(@tmp2,'0','')<>''
   select @num=convert(int,reverse(@tmp2))-1
        ,@re= stuff(@tmp1,len(@tmp1)-len(@tmp2)+1,len(@tmp2),right(replace(space(len(@tmp2)),' ','0')+rtrim(@num),len(@tmp2)))
  else
   select @re=@tmp1
end
else
  select @re=@tmp1

return @re
end

GO

--以后可以直接用。。。
select dbo.usf_test('1078A10D10_0_10516-13')

#13


----------------------------------------------------------------
-- Author  :fredrickhu(小F,向高手学习)
-- Date    :2012-05-25 16:53:19
-- Version:
--      Microsoft SQL Server 2008 R2 (RTM) - 10.50.1617.0 (Intel X86) 
-- Apr 22 2011 11:57:00 
-- Copyright (c) Microsoft Corporation
-- Enterprise Edition on Windows NT 6.1 <X64> (Build 7600: ) (WOW64)
--
----------------------------------------------------------------
--> 测试数据:[tb]
if object_id('[tb]') is not null drop table [tb]
go 
create table [tb]([caseno] varchar(21))
insert [tb]
select '1076D67D71_0_10516-13' union all
select '16D7D131_0_10516-13'
--------------开始查询--------------------------
select *  into #t from(select parsename(replace(caseno,'_','.'),3) as a from tb)t 

--select * from #t

select left(a,len(a)-1)+ltrim(cast(right(a,1) as int)-1) from #t

drop table #t 
----------------结果----------------------------
/* --------------------------------------------------------------------------------------------------------------------------------------------
1076D67D70
16D7D130

(2 行受影响)

*/

#14


引用 12 楼  的回复:
SQL code

--建个function
Create Function dbo.usf_test(@s varchar(100))
returns  varchar(100)
as
begin

declare @tmp1 varchar(100),@tmp2 varchar(100), @num int,@re varchar(100)

select @tmp1=le……

沟沟 你还忙活。  sql中截取字符串"_"前的字符并且最后一位数字-1;

#15


 收藏+学习 ;新手请谅解。 

#16


刚开始时觉得挺简单的,以为就是字符串处理,后来仔细看才发觉要花一番功夫,学习了!