我需要帮助以特定方式格式化数字。
如果一个数字有三个小数位或更少,我希望它保持不变。
如果一个数字超过三个有效数字,我希望第三个有效数字之后的所有数字都是该数字的小数部分。
123 --> Stays the same
1234 --> 123.4
如何做到这一点?
编辑:
1234567 --> 123.4567
我在SQL 2007上,希望更新表中的值。该值存储为数字。
答案 0 :(得分:2)
这是一个数字解决方案:
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,你需要注意精度。请注意,这适用于已经提到的所有更新解决方案。
答案 1 :(得分:1)
这可行吗
SELECT
CASE WHEN Num > 999 THEN Num/10
ELSE
Num
END As Num
可能有更好的方法,但这是我能想到的
答案 2 :(得分:1)
您可以使用字符串执行此操作。
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上放了一个example。
答案 3 :(得分:1)
假设只有整数值的字符串:
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
答案 4 :(得分:1)
I answered this on a cross-post elsewhere,但为了完整性:
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;