求SQL语句获取指定字符后的第一个数字

FanKe000 2009-09-17 02:50:17
有表某列数据如下:
132*345*789ABC

dfd*fd*fdf754

dfd1*21*fda489(dfda)

29*das2*(fda)123

我想要的结果是每列中最后一个*号的后的第一个数字
789

754

489

123

全部都是字符串类型
...全文
1061 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
xiequan2 2009-09-17
  • 打赏
  • 举报
回复
--> 测试数据:@tb
declare @tb table([col] varchar(20))
insert @tb
select '132*345*789ABC' union all
select 'dfd*fd*fdf754' union all
select 'dfd1*21*fda489(dfda)' union all
select '29*das2*(fda)123'

select substring(stuff('a'+reverse(substring(reverse(col),1,charindex('*',reverse(col))-1)),
1,PATINDEX('%[0-9]%','a'+reverse(substring(reverse(col),1,charindex('*',reverse(col))-1)))-1,'')+'a',
1,PATINDEX('%[^0-9]%',stuff('a'+reverse(substring(reverse(col),1,charindex('*',reverse(col))-1)),
1,PATINDEX('%[0-9]%','a'+reverse(substring(reverse(col),1,charindex('*',reverse(col))-1)))-1,'')+'a')-1) from @tb

/*

----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
789
754
489
123

(4 行受影响)


*/
csdyyr 2009-09-17
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 fanke000 的回复:]
这样写会把*后的所有数字都返回出来,这个没事,毕竟不符合要求的很少,我可以再一一改就好了
[/Quote]
我的没这个问题的。
FanKe000 2009-09-17
  • 打赏
  • 举报
回复
谢谢csdyyr和SQL77,原来函数有个地方写错了returns int 改成 return varchar(100)就行了
太粗心了。
SQL77 2009-09-17
  • 打赏
  • 举报
回复
参考了一下网上的资料,获取字符串的函数:
Create function [dbo].[F_Get_Number] (@S varchar(5000))
returns BIGINT
AS
begin
while PATINDEX('%[^0-9]%',@S)>0
begin
set @s=stuff(@s,patindex('%[^0-9]%',@s),1,'')
end
return @S
end

然后通过语句过滤指定字符串:
select dbo.F_Get_Number(REVERSE(SUBSTRING(REVERSE(列),1,CHARINDEX('*',REVERSE(列))-1)))


用BIGINT
FanKe000 2009-09-17
  • 打赏
  • 举报
回复
这样写会把*后的所有数字都返回出来,这个没事,毕竟不符合要求的很少,我可以再一一改就好了
csdyyr 2009-09-17
  • 打赏
  • 举报
回复
CREATE TABLE TB ([COL] VARCHAR(30))
INSERT TB
SELECT '132*345*789ABC' UNION ALL
SELECT 'dfd*fd*fdf754' UNION ALL
SELECT 'dfd1*21*fda489(dfda)' UNION ALL
SELECT '29*das2*(fda)123xxx256'
GO

CREATE FUNCTION F_GETDIGITS(@S VARCHAR(100))
RETURNS VARCHAR(100)
AS
BEGIN
DECLARE @T VARCHAR(100)
SET @T=''
WHILE PATINDEX('%[0-9]%',@S)>0
BEGIN
SET @T=@T+SUBSTRING(@S,PATINDEX('%[0-9]%',@S),1)
SET @S=STUFF(@S,1,PATINDEX('%[0-9]%',@S),'')
IF PATINDEX('%[^0-9]%',LEFT(@S,1))>0
BREAK
END
RETURN @T
END
GO

SELECT dbo.F_GETDIGITS(REVERSE(SUBSTRING(REVERSE(COL),1,CHARINDEX('*',REVERSE(COL))-1)))
FROM TB

DROP TABLE TB
DROP FUNCTION F_GETDIGITS
/*
789
754
489
123
*/
hbjlwhl 2009-09-17
  • 打赏
  • 举报
回复
正则或者循环判断!!跟查找差不多。
FanKe000 2009-09-17
  • 打赏
  • 举报
回复
参考了一下网上的资料,获取字符串的函数:
Create function [dbo].[F_Get_Number] (@S varchar(5000))
returns int
AS
begin
while PATINDEX('%[^0-9]%',@S)>0
begin
set @s=stuff(@s,patindex('%[^0-9]%',@s),1,'')
end
return @S
end

然后通过语句过滤指定字符串:
select dbo.F_Get_Number(REVERSE(SUBSTRING(REVERSE(列),1,CHARINDEX('*',REVERSE(列))-1)))

但是这样会返回一个错误:
转换 varchar 值 '60010003125' 时溢出了整数列。超过了其中最大的整数值。
可是函数返回的是字符串啊,不是整数啊,为什么还报这个错?
soft_wsx 2009-09-17
  • 打赏
  • 举报
回复
规则不明,太乱了!
FanKe000 2009-09-17
  • 打赏
  • 举报
回复
489.
就是最后一个*号末的第一个数
xiequan2 2009-09-17
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 fanke000 的回复:]
各位能说的详细一点吗?最好能给个例子看下
[/Quote]dfd1*21*fda489(dfda)21321你返回什么?
SQL77 2009-09-17
  • 打赏
  • 举报
回复
写函数吧
FanKe000 2009-09-17
  • 打赏
  • 举报
回复
各位能说的详细一点吗?最好能给个例子看下
soft_wsx 2009-09-17
  • 打赏
  • 举报
回复
patindex/charindex
--小F-- 2009-09-17
  • 打赏
  • 举报
回复
要用到正则表达式 学习

34,873

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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