SQL中去除某列的非数字字符问题

JackyAndApplet 2007-04-27 11:34:28
有这么一个SQL:
select A.projectname,A.projectid,A.Xi,B.CLx,B.UCLx,B.LCLx from
(select projectname,value as Xi,projectid from TBLPAS_PRJ_TARGET where type = '末轮测试缺陷密度(个/KLOC)'
and charindex(','+rtrim(projectid)+',',','+'2008001,2008002'+',')>0) as A,
(select
avg (CAST(SUBSTRING(value,1,PATINDEX('%[^0.-9.]%',value)-1) as float)) as CLx,
avg(CAST(SUBSTRING(value,1,PATINDEX('%[^0.-9.]%',value)-1) as float)) + stdev(CAST(SUBSTRING(value,1,PATINDEX('%[^0.-9.]%',value)-1) as float)) as UCLx,
avg(CAST(SUBSTRING(value,1,PATINDEX('%[^0.-9.]%',value)-1) as float)) - stdev(CAST(SUBSTRING(value,1,PATINDEX('%[^0.-9.]%',value)-1) as float)) as LCLx
from TBLPAS_PRJ_TARGET
where type = '末轮测试缺陷密度(个/KLOC)'
and charindex(','+rtrim(projectid)+',',','+'2008001,2008002'+',')>0) as B
我的数据库中有的字段的值有%如45.7%,有的没有如:45.7
而SUBSTRING(value,1,PATINDEX('%[^0.-9.]%',value)-1)
中的PATINDEX用来查找非数字的字符在value这列的第几位,如果这个时候有%的话都一切正常,而如果没%PATINDEX就找不到则返回0在减去1就等于-1这个时候在传给sbustring就会产生向 substring 函数传递了无效的 length 参数。
出现这中情况该怎么处理呢?
...全文
1092 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
lwl0606 2007-04-27
  • 打赏
  • 举报
回复
avg (CAST(SUBSTRING(REPLACE(value ,'%',''),1,PATINDEX('%[^0.-9.]%',REPLACE(value ,'%',''))-1) as float))
不行吗?
wgzaaa 2007-04-27
  • 打赏
  • 举报
回复
直接用replace替换,转换类型后运算不好吗
中国风 2007-04-27
  • 打赏
  • 举报
回复
dbo.test_f(去掉非数字的列名)
中国风 2007-04-27
  • 打赏
  • 举报
回复
用函数:





create function test_f(@name varchar(50))
returns varchar(50)
as
begin
while patindex('%[^0-9]%',@name)>0
set @name=stuff(@name,patindex('%[^0-9]%',@name),1,'')
return @name
end

用法:
declare @name varchar(200)
set @name='1231dasd4566asdf'
select dbo.test_f(@name)
JackyAndApplet 2007-04-27
  • 打赏
  • 举报
回复
没人知道吗?100分都没人回答吗???

34,590

社区成员

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

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