首页 > 解决方案 > 如何在 SQL 中转换此值?

问题描述

我有像

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

谢谢鲍勃

标签: sqlsql-serversql-server-2012

解决方案


只需删除'然后除以 1000:

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

如果您必须将其保留到小数点后 3 位,请使用CONVERT将值更改为 adecimal(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的 s。它并不完全“漂亮”,但是,它非常简单。CONVERT在初始值之后需要外部TRY_CONVERT值,以便该值只有 3 个小数位。Adecimal(12/3) / decimal(4,0)将导致比例为max(6, s1 + p2 + 1) = max(6, 3 + 4 + 1) = max(6,8) = 8,这超出了 OP 的要求。所以 value'3'023'最终会成为 value '3.02300000' 精度、比例和长度 (Transact-SQL)


推荐阅读