2012-06-13 2 views
0

Мне нужна помощь в форматировании чисел определенным образом.Как мне форматировать числа в таблице SQL?

Если число имеет три знака после запятой или меньше, я бы хотел, чтобы он остался прежним.

Если число содержит более трех значащих цифр, я хотел бы, чтобы все цифры после третьей значащей цифры были дробной частью числа.

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

Как это можно сделать?

EDIT:

1234567 --> 123.4567 

Я на SQL 2007, желая обновить значение в таблице. Значение сохраняется как числовое.

+6

Какие СУБД вы используете? Вы просто хотели бы ВЫБРАТЬ это для форматирования, или вы хотите ОБНОВИТЬ эти значения обратно в таблицу? –

+0

Для номера '1234567', должен ли быть результат' 123.4567' или '123.456.7'? –

+0

SQL 2007 Я верю, обновите значение, 123.4567 – clmcleod

ответ

1

Это может работать

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

Там может быть лучше, но это то, что я мог думать о

+0

Это не сработало бы для чисел больше 9999, так как числа 10000-99999 нужно было бы разделить на 100 и так далее. –

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)); 

Я поставил рабочий example на SQLFiddle.

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 
+0

Мне нравится использование STUFF. Для SQL-сервера это хорошее решение. –

2

Вот числовое решение:

UPDATE T SET NUM = NUM/POWER(10,FLOOR(LOG10(NUM))-2) 
WHERE NUM>=1000 

Или ЗЕЬЕСТ:

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

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; 
Смежные вопросы