我需要帮助以特定方式格式化数字。
如果一个数字的小数点后三位或更少,我希望它保持不变。
如果一个数字有三个以上的有效数字,我希望第三个有效数字之后的所有数字都是数字的小数部分。
123 --> Stays the same
1234 --> 123.4
如何才能做到这一点?
编辑:
1234567 --> 123.4567
我在 SQL 2007 上,希望更新表中的值。该值存储为数字。
我需要帮助以特定方式格式化数字。
如果一个数字的小数点后三位或更少,我希望它保持不变。
如果一个数字有三个以上的有效数字,我希望第三个有效数字之后的所有数字都是数字的小数部分。
123 --> Stays the same
1234 --> 123.4
如何才能做到这一点?
编辑:
1234567 --> 123.4567
我在 SQL 2007 上,希望更新表中的值。该值存储为数字。
这是一个数字解决方案:
UPDATE T SET NUM = NUM/POWER(10,FLOOR(LOG10(NUM))-2)
WHERE NUM>=1000
或 SELECT 语句:
SELECT NUM, CASE WHEN NUM<1000 THEN NUM
ELSE NUM/POWER(10,FLOOR(LOG10(NUM))-2)
END AS NewNUM
FROM T
请注意,确切的结果可能会因 NUM 的数据类型而异。如果是 FLOAT 字段,如果 NUM 太大,它可能会舍入最后一个小数。如果它是 NUMERIC 类型,它将在末尾添加零。如果是 DECIMAL,则需要注意精度。请注意,这适用于已经提到的所有更新解决方案。
这可以工作
SELECT
CASE WHEN Num > 999 THEN Num/10
ELSE
Num
END As Num
可能有更好的方法,但这是我能想到的
假设只有整数值的字符串:
SELECT CASE WHEN LEN(Num) <= 3 THEN Num
ELSE STUFF(Num,4,0,'.')
END
FROM (VALUES('1234567'),('123'),('1234'),('12')) t(Num) --some sample values
结果:
123.4567
123
123.4
12
你可以用字符串做到这一点。
CREATE TABLE T
( NUM NUMERIC(38,19) );
INSERT INTO T (NUM) VALUES ( 123456789 );
INSERT INTO T (NUM) VALUES ( 12345 );
INSERT INTO T (NUM) VALUES ( 123 );
INSERT INTO T (NUM) VALUES ( 1 );
SELECT CAST(
CASE WHEN NUM < 999 THEN CAST(FLOOR(NUM) AS VARCHAR)
ELSE SUBSTRING(CAST(NUM AS VARCHAR), 1, 3) + '.'
+ SUBSTRING(CAST(FLOOR(NUM) AS VARCHAR), 4, LEN(CAST(NUM AS VARCHAR)) - 3)
END AS NUMERIC(38, 19))
FROM T
UPDATE T
SET NUM = CAST(CASE WHEN NUM < 999 THEN CAST(FLOOR(NUM) AS VARCHAR)
ELSE SUBSTRING(CAST(NUM AS VARCHAR), 1, 3) + '.'
+ SUBSTRING(CAST(FLOOR(NUM) AS VARCHAR), 4, LEN(CAST(NUM AS VARCHAR)) - 3)
END AS NUMERIC(38, 19));
我在 SQLFiddle 上放了一个工作示例。
我在其他地方的交叉帖子上回答了这个问题,但为了完整起见:
WITH n(r) AS (
SELECT 123 UNION ALL SELECT 1234 UNION ALL SELECT 1234567
)
SELECT LEFT(r, 3) + CASE
WHEN LEN(r) > 3 THEN '.' + SUBSTRING(RTRIM(r),4,38) ELSE '' END
FROM n;