如:'库房1号' , '11号监测点' ,字符串格式并不固定,数字位置可能不同,数字大小长度可能不同,有的甚至不含数字,怎么取出字符串最后一个包含数字的值呢.
解决方案 »
- 如何对表中的一条记录进行锁定,它用户无法进行修改,但允许自己更新。适当的时候还要进行解锁
- 请教:记录向字段的转置问题
- 紧急求助,数据库恢复的问题100分
- 怎么写才能返回某列的内容,和它的全部行数?
- 有关字符串执行的问题 exec('select * into #ware from jinhuflag') 急!
- 调试自己编写的存储过程时,您是怎么跟踪的程序运行情况的?
- 怎么知道一个表有又个触发器?
- 请问在两个日期之间的查询语句怎么写?
- My God,快来看我这个愚蠢的问题!
- 请教:在用SQL Server的客户端连服务器时,报以下错误,请各位大侠帮我诊断
- c#中如何调用Sqlserver自定义函数
- EJB3.0的persistence.xml配置文件怎么写
if object_id('tempdb.dbo.#tb') is not null drop table #tb
go
create table #tb (id varchar(10))
insert into #tb
select '库房1号' union all
select '11号监测点'
if object_id('f_str')is not null drop function f_str
go
create function f_str(@id varchar(100))
returns varchar(10)
as
begin
declare @str varchar(100),@lenNUM int ,@len int
set @str=''
set @lenNUM=patindex('%[0-9]%',reverse(@id)) --倒转后第一个数字起始位
set @len=len(@id) while @lenNum<=@len
begin
if isnumeric(substring(REVERSE(@id),@lenNUM,1))=1
set @str=@str+substring(REVERSE(@id),@lenNUM,1)
set @lenNUM=@lenNUM+1
end
return @str
end
go select id,number=dbo.f_str(id) from #tb
id number
---------- ----------
库房1号 1
11号监测点 11(2 行受影响)
SET @str = '11号监测点'SELECT SUBSTRING(@str,PATINDEX('%[0-9]%',@str),LEN(@str) - PATINDEX('%[0-9]%',REVERSE(@str)) - PATINDEX('%0-9%',@str) - PATINDEX('%[0-9]%',@str) + 2)SET @str = '库房1号'SELECT SUBSTRING(@str,PATINDEX('%[0-9]%',@str),LEN(@str) - PATINDEX('%[0-9]%',REVERSE(@str)) - PATINDEX('%0-9%',@str) - PATINDEX('%[0-9]%',@str) + 2)
/*
--------------------
11(所影响的行数为 1 行)
--------------------
1(所影响的行数为 1 行)
*/
SELECT @STR='A1234号监测点'
SELECT REVERSE(STUFF(REVERSE(STUFF(@STR,1,PATINDEX('%[0-9]%',@STR)-1,'')),1,PATINDEX('%[0-9]%',REVERSE(STUFF(@STR,1,PATINDEX('%[0-9]%',@STR)-1,'')))-1,''))
--1234
DECLARE @STR VARCHAR(50)
SELECT @STR='A1234.560号监测点'
SELECT CONVERT(FLOAT,REVERSE(STUFF(REVERSE(STUFF(@STR,1,PATINDEX('%[0-9.]%',@STR)-1,'')),1,PATINDEX('%[0-9.]%',REVERSE(STUFF(@STR,1,PATINDEX('%[0-9.]%',@STR)-1,'')))-1,'')))
--1234.56
DECLARE @STR VARCHAR(50)
SELECT @STR='ae12rd1234.560号监测点'
SELECT
CASE WHEN STUFF(REVERSE(@STR),1,PATINDEX('%[0-9.]%',REVERSE(@STR))-1,'') LIKE '%[^0-9.]%' THEN
CONVERT(FLOAT,REVERSE(STUFF(STUFF(REVERSE(@STR),1,PATINDEX('%[0-9.]%',REVERSE(@STR))-1,''),PATINDEX('%[^0-9.]%',STUFF(REVERSE(@STR),1,PATINDEX('%[0-9.]%',REVERSE(@STR))-1,'')),LEN(STUFF(REVERSE(@STR),1,PATINDEX('%[0-9.]%',REVERSE(@STR))-1,'')),'')))
ELSE
CONVERT(FLOAT,STUFF(REVERSE(@STR),1,PATINDEX('%[0-9.]%',REVERSE(@STR))-1,''))
END
--1234.56
if object_id('tempdb.dbo.#tb') is not null drop table #tb
go
create table #tb (id varchar(10))
insert into #tb
select '库房1号' union all
select '11号监测点'
select id,
reverse(substring(reverse(left(id,len(id)-patindex('%[0-9]%',reverse(id))+1)),
1,
patindex('%[^0-9]%',
reverse(left(id,len(id)-patindex('%[0-9]%',reverse(id))+1))+'|'
)-1)
)
from #tb id
---------- ----------
库房1号 1
11号监测点 11(2 行受影响)