当前位置: 代码迷 >> Sql Server >> sql 怎么按某字符分割提取单个字段出来
  详细解决方案

sql 怎么按某字符分割提取单个字段出来

热度:91   发布时间:2016-04-24 09:08:39.0
sql 怎样按某字符分割提取单个字段出来?
有一个表A,规格里可能有小数点,提取后再四舍五入:
A01[厚度float]      A02[宽度float]       A03[长度float]      A04[规格]
  null              null                 null                  8*150.05*990.65
....

将A04里的三个数字分割出来分别放到A01,A02,A03字段(都是float)里,结果如下:
A01[厚度]      A02[宽度]       A03[长度]      A04[规格]
8                    150               991                  8*150*991
....
求一个高效的方法,谢谢
------解决思路----------------------
UPDATE A
   SET A01 = ROUND(REPLACE(PARSENAME(REPLACE(REPLACE(A04,'.','_'),'*','.'),3),'_','.'),0),
       A02 = ROUND(REPLACE(PARSENAME(REPLACE(REPLACE(A04,'.','_'),'*','.'),2),'_','.'),0),
       A03 = ROUND(REPLACE(PARSENAME(REPLACE(REPLACE(A04,'.','_'),'*','.'),1),'_','.'),0)

UPDATE A
   SET A04 = Convert(varchar(10),A01)+'*'+
             Convert(varchar(10),A02)+'*'+
             Convert(varchar(10),A03)
SELECT * FROM A

                   A01                    A02                    A03 A04
---------------------- ---------------------- ---------------------- --------------------------------
                     8                    150                    991 8*150*991

------解决思路----------------------
没什么效率的。
非规整数据应该再插入前就进行预处理,这样会生成大量日志。
------解决思路----------------------
SELECT ROUND(a.col.query('/root/v[1]').value('.','float'),0) A01
,ROUND(a.col.query('/root/v[2]').value('.','float'),0) A02
,ROUND(a.col.query('/root/v[3]').value('.','float'),0) A03
,a.A04
FROM (SELECT A04,CONVERT(XML,'<root><v>'+REPLACE(A04,'*','</v><v>')+'</v></root>') col FROM t ) a

------解决思路----------------------
每个A04都有转成XML也很费时。
总之不规则的数据不会有高效的方法。
  相关解决方案