如何在SQL中转换此值?

时间:2018-07-31 18:39:31

标签: sql sql-server sql-server-2012

我的值类似于

3'023
'464
2'652
21.6%
'64

我正在使用以下SQL代码更改为如下所示;

UPDATE table 
SET Adjusted_value_tst = REPLACE(LTRIM(RTRIM(value)), '''', '.')
WHERE [Value] LIKE '%''%';

结果:

3.023
0.464
2.652
21.6%
0.64

这对于3个十进制值是正确的。但是,我应该将'64转换为0.064

请帮助我如何修改查询以转换诸如 3'023至3.023和'64至0.064

谢谢 鲍勃

3 个答案:

答案 0 :(得分:1)

只需除去',然后除以1000:

SELECT *, REPLACE(N,'''','') / 1000.0
FROM (VALUES ('3''023'),('''464'),('2''652'),('''64')) V(N);

如果必须将其保留到小数点后三位,请使用CONVERT将值更改为decimal(12,3)或类似的值。

编辑:

OP似乎不知道UPDATE的语法。这将是:

UPDATE YourTable
SET YourColumn = REPLACE(YourColumn,'''','') / 1000.0;

编辑2:

OP的场景比最初描述的要多。这个应该(现在可以编辑)了,只要不存在我们不知道的更多情况...

UPDATE YourTable
SET YourColumn = ISNULL(CONVERT(varchar(20),CONVERT(decimal(12,3),TRY_CONVERT(decimal(12,3),REPLACE(YourColumn,'''','')) / 1000)), YourColumn);

这涉及几个嵌套的CONVERT。它不是完全“漂亮”的,但是,它很简单。需要在起始CONVERT之后加上外部TRY_CONVERT,以便该值仅具有3个小数位。 decimal(12/3) / decimal(4,0)的缩放比例为max(6, s1 + p2 + 1) = max(6, 3 + 4 + 1) = max(6,8) = 8,超出了OP的期望。 因此,值'3'023'最终将成为值'3.02300000' Precision, scale, and Length (Transact-SQL)

答案 1 :(得分:0)

如果数据中始终只有一个',则可以使用charindex()找到它。从那里,您可以计算'左右部分的长度。如果正确的长度小于3,则可以根据需要使用stuff()replicate()插入尽可能多的0。如果左侧部分的长度小于1,则在0之前加上前缀(否则,即为空字符串)。然后像以前一样操作replace()。 (当然,您也可以反过来做,首先替换一个,然后再进行上述操作。)

UPDATE elbat
       SET adjusted_value_tst = replace(CASE
                                          WHEN charindex('''',
                                                         rtrim(ltrim(adjusted_value_tst))) < 2 THEN
                                                           '0'
                                                         ELSE
                                                           ''
                                                       END
                                                       +
                                                       stuff(rtrim(ltrim(adjusted_value_tst)),
                                                             charindex('''',
                                                                       rtrim(ltrim(adjusted_value_tst)))
                                                             + 1,
                                                             0,
                                                             replicate('0',
                                                                       3
                                                                       - len(rtrim(ltrim(adjusted_value_tst)))
                                                                       + charindex('''',
                                                                                   rtrim(ltrim(adjusted_value_tst))))),
                                                      '''',
                                                      '.');

SQL Fiddle

答案 2 :(得分:0)

不确定这是否有帮助,但是您可以建立一个需要转换的唯一(不同)值的转换表,然后在Update语句中查找适当的值。

我已将数据导出到Excel以更好地处理数据,然后使用输出列运行一些公式。将其导入回Sql,并从转换中执行更新。但是,在更改数据之前,无论做什么,都要备份表。

相关问题