如有字段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
别听F妈瞎扯,
刚才那帖子里我写的那么多,LZ居然没明白,太浪费我感情了,还只给我10分。。。
刚才那帖子里我写的那么多,LZ居然没明白,太浪费我感情了,还只给我10分。。。
#3
请问如何让最后一位-1呢???
-------------为是0时,怎样显示
-------------为是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
没看清楚题目。
#9
呵呵,谢谢大家了。
magician547 ——以帮我解决问题。
magician547 ——以帮我解决问题。
#10
我只想说,LZ你太不严谨了。。。。
#11
如有字段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
沟沟 你还忙活。
#15
收藏+学习 ;新手请谅解。
#16
刚开始时觉得挺简单的,以为就是字符串处理,后来仔细看才发觉要花一番功夫,学习了!
#1
SELECT SUBSTRING(caseno,1,9)+LTRIM((CAST(SUBSTRING(caseno,10,1) AS INT)-1))
好早就答过了 不看 也不去试。
#2
别听F妈瞎扯,
刚才那帖子里我写的那么多,LZ居然没明白,太浪费我感情了,还只给我10分。。。
刚才那帖子里我写的那么多,LZ居然没明白,太浪费我感情了,还只给我10分。。。
#3
请问如何让最后一位-1呢???
-------------为是0时,怎样显示
-------------为是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
没看清楚题目。
#9
呵呵,谢谢大家了。
magician547 ——以帮我解决问题。
magician547 ——以帮我解决问题。
#10
我只想说,LZ你太不严谨了。。。。
#11
如有字段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
沟沟 你还忙活。
#15
收藏+学习 ;新手请谅解。
#16
刚开始时觉得挺简单的,以为就是字符串处理,后来仔细看才发觉要花一番功夫,学习了!