如何格式化SQL表中的数字?

时间:2012-06-13 18:09:01

标签: sql sql-server tsql

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

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

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

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

如何做到这一点?

编辑:

1234567 --> 123.4567

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

5 个答案:

答案 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;