我的值类似于
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
谢谢 鲍勃
答案 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))))),
'''',
'.');
答案 2 :(得分:0)
不确定这是否有帮助,但是您可以建立一个需要转换的唯一(不同)值的转换表,然后在Update语句中查找适当的值。
我已将数据导出到Excel以更好地处理数据,然后使用输出列运行一些公式。将其导入回Sql,并从转换中执行更新。但是,在更改数据之前,无论做什么,都要备份表。