0

我需要帮助以特定方式格式化数字。

如果一个数字的小数点后三位或更少,我希望它保持不变。

如果一个数字有三个以上的有效数字,我希望第三个有效数字之后的所有数字都是数字的小数部分。

123 --> Stays the same
1234 --> 123.4

如何才能做到这一点?

编辑:

1234567 --> 123.4567

我在 SQL 2007 上,希望更新表中的值。该值存储为数字。

4

5 回答 5

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,则需要注意精度。请注意,这适用于已经提到的所有更新解决方案。

于 2012-06-13T20:01:33.350 回答
1

这可以工作

SELECT 
   CASE WHEN Num > 999 THEN Num/10
   ELSE
      Num
   END As Num

可能有更好的方法,但这是我能想到的

于 2012-06-13T18:30:32.650 回答
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
于 2012-06-13T19:38:15.157 回答
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 上放了一个工作示例。

于 2012-06-13T18:45:10.157 回答
1

我在其他地方的交叉帖子上回答了这个问题,但为了完整起见:

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;
于 2012-06-14T20:57:10.243 回答