怎么把字段中的汉字删掉只保留数字

yaojunyi3721 2014-09-19 08:41:05
一个字段保存的数据时这样的
现在要统计产品数量 想把里面的非数字剔除掉 再转换成数值类型
怎么样才能去掉非数字并且批量更新呢
...全文
1066 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
jayzhihui 2014-09-21
  • 打赏
  • 举报
回复
有点问题该一下

IF object_id('tempdb..#test') IS NOT NULL
    DROP TABLE #test
    GO
 
CREATE TABLE #test
(
 ID  INT,
 Val VARCHAR(32)
)
GO
 
INSERT INTO #test 
SELECT 1 ,N'2-3吨' UNION ALL
SELECT 2 , N'40吨'   UNION ALL
SELECT 3 , N'1吨'  UNION ALL
SELECT 4 , N'0.2吨' UNION     ALL
SELECT 5 , N'512-6456吨' union all
SELECT 5 , N'70-80吨'

declare @str varchar(max) = ''

select @str=@str+
  case when replace(replace(val,'吨',''),'-','+') like '%+%' then QUOTENAME(replace(replace(val,'吨',''),'-','+'),'()') + '/2.0' 
  else replace(replace(val,'吨','') ,'-','+') end +' val union all select '
from #test


select @str = LEFT(@str,len(@str) -17) 
exec('select '+ @str)


/*

(6 行受影响)

---------------------------------------
2.500000
40.000000
1.000000
0.200000
3484.000000
75.000000

(6 行受影响)
*/







jayzhihui 2014-09-21
  • 打赏
  • 举报
回复
如果格式固定的话可以用试试这个
IF object_id('tempdb..#test') IS NOT NULL
    DROP TABLE #test
    GO
 
CREATE TABLE #test
(
 ID  INT,
 Val VARCHAR(32)
)
GO
 
INSERT INTO #test 
SELECT 1 ,N'2-3吨' UNION ALL
SELECT 2 , N'40吨'   UNION ALL
SELECT 3 , N'1吨'  UNION ALL
SELECT 4 , N'0.2吨' UNION     ALL
SELECT 5 , N'512-6456吨' union all
SELECT 5 , N'70-80吨'

declare @str varchar(max) = ''

select @str=@str+
  case when replace(replace(val,'吨',''),'-','+') like '%+%' then replace(replace(val,'吨',''),'-','+') + '/2.0' 
  else replace(replace(val,'吨','') ,'-','+') end +' val union all select '
from #test

select @str = LEFT(@str,len(@str) -17) 
exec('select '+ @str)


/*
(6 行受影响)
val
---------------------------------------
3.500000
40.000000
1.000000
0.200000
3740.000000
110.000000

(6 行受影响)
*/

jayzhihui 2014-09-21
  • 打赏
  • 举报
回复
IF object_id('tempdb..#test') IS NOT NULL DROP TABLE #test GO CREATE TABLE #test ( ID INT, Val VARCHAR(32) ) GO INSERT INTO #test SELECT 1 ,N'2-3吨' UNION ALL SELECT 2 , N'40吨' UNION ALL SELECT 3 , N'1吨' UNION ALL SELECT 4 , N'0.2吨' UNION ALL SELECT 5 , N'512-6456吨' union all SELECT 5 , N'70-80吨' declare @str varchar(max) = '' select @str=@str+ case when replace(replace(val,'吨',''),'-','+') like '%+%' then replace(replace(val,'吨',''),'-','+') + '/2.0' else replace(replace(val,'吨','') ,'-','+') end +' val union all select ' from #test select @str = LEFT(@str,len(@str) -17) exec('select '+ @str)
---涛声依旧--- 2014-09-21
  • 打赏
  • 举报
回复
20-30去掉字符后,岂不成了2030,那也不准确了 最终解决方案是另外建立一个数值型的字段来存储了
jieweibin 2014-09-19
  • 打赏
  • 举报
回复
参考 http://bbs.csdn.net/topics/260080501,最后替换中文即可 -提取中文 IF OBJECT_ID('DBO.CHINA_STR') IS NOT NULL DROP FUNCTION DBO.CHINA_STR GO CREATE FUNCTION DBO.CHINA_STR(@S NVARCHAR(100)) RETURNS VARCHAR(100) AS BEGIN WHILE PATINDEX('%[^吖-座]%',@S) > 0 SET @S = STUFF(@S,PATINDEX('%[^吖-座]%',@S),1,N'') RETURN @S END GO PRINT replace('50-60吨',DBO.CHINA_STR('50-60吨'),'') GO
豫新 2014-09-19
  • 打赏
  • 举报
回复
if object_id('dbo.#tempt11') is not null  drop table #tempt11
 create table #tempt11(mainproductcount varchar(50))

 insert into #tempt11
 select '10頓' as mainproductcount   union all
  select '10-20頓' as mainproductcount   union all
 select '20' as mainproductcount   union all
   select '40頓' as mainproductcount   union all
	 select '50頓' as mainproductcount   union all
	 select '20' as mainproductcount


select replace( mainproductcount ,'頓','') as mainproductcount into #tempt12 from #tempt11
select case when CHARINDEX('-',mainproductcount)=0 then convert(numeric(12,2),mainproductcount )
                   else  (convert(numeric(12,2),substring(mainproductcount,1,CHARINDEX('-',mainproductcount)-1 ))+
				    convert(numeric(12,2),substring(mainproductcount,(len(mainproductcount)-CHARINDEX('-',mainproductcount)+2),len(mainproductcount))))/2 
				   end index_1 from #tempt12
轉換的優點麻煩..大概就這個意思
freecodex 2014-09-19
  • 打赏
  • 举报
回复
IF object_id('test') IS NOT NULL
	DROP TABLE test
	GO

CREATE TABLE test
(
 ID  INT,
 Val VARCHAR(32)
)
GO

INSERT INTO test 
SELECT 1 ,N'2-3顿' UNION ALL
SELECT 2 , N'40'   UNION ALL
SELECT 3 , N'1顿'  UNION ALL
SELECT 4 , N'0.2 ' UNION	 ALL
SELECT 5 , N'512-6456吨'


--Step1:将Val字段定义为Varchar型,通过字符数与字节数来判断字段的组合类型
;WITH t1 AS(
SELECT id,SUBSTRING(val,1,LEN(val) - 1) 'val'
FROM test  where LEN(RTRIM(val)) < DATALENGTH(RTRIM(val))
)

--去掉中文字符
UPDATE test	
SET test.val = t1.val
FROM test INNER JOIN t1 ON t1.id = test.id


--Step 2: 对于xx-yy类型的组合分裂,可以通过isnumeric()函数判断
;WITH t2 AS(
SELECT id,val, 
SUBSTRING(val,1,CHARINDEX('-',val)-1) 'leftVal',
 SUBSTRING(SUBSTRING(val,CHARINDEX('-',val) + 1,LEN(val)),1,LEN(SUBSTRING(val,CHARINDEX('-',val) + 1,LEN(val)))) 'rightVal'
FROM test WHERE ISNUMERIC(val) <= 0
)
SELECT id,val , (CAST(leftVal AS DECIMAL(10,2)) + CAST(rightVal AS DECIMAL(10,2))) / 2	'Ver' FROM t2
frankl123 2014-09-19
  • 打赏
  • 举报
回复
create function [dbo].[Get_Number] (@S varchar(100))
returns int
AS 
begin
    while PATINDEX('%[^0-9]%',@S)>0
          begin
                set @s=stuff(@s,patindex('%[^0-9]%',@s),1,'')
          end
    return cast(@S as int)
end
yaojunyi3721 2014-09-19
  • 打赏
  • 举报
回复
引用 2 楼 bw555 的回复:
用正则表达式把字符串中的数字都截取出来,然后再把截取出来的数字组合在一起
表里的数据都处理的差不多了 看起来都是数字了 但是有些数字前面有空格 用ltrim(rtrim(xxx)) 替换不起作用 查找like ' %' 也找不到数据 可能是制表符或者tab之类的 既然处理不掉 我就索性试着转换字段类型 但是提示
- 无法修改表。
从数据类型 nvarchar 转换为 numeric 时出错。
如何找到不能转换为数值的记录呢 如果是c# 有decimal.tryparse() 这种函数判断是否能转换 SqlServer下是什么
霜寒月冷 2014-09-19
  • 打赏
  • 举报
回复
20-30 不能转换数值类型
bw555 2014-09-19
  • 打赏
  • 举报
回复
用正则表达式把字符串中的数字都截取出来,然后再把截取出来的数字组合在一起
yaojunyi3721 2014-09-19
  • 打赏
  • 举报
回复
里面有"70-80"的不应直接去掉- 那样变成了7080数值相去甚远 应该为75 这个是个例 而且较少 如果不好实现 可以做个判断不更新 然后我手动更改也可

27,579

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 应用实例
社区管理员
  • 应用实例社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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