Преобразование отрицательного числа с круглыми скобками в минус в MYSQL - PullRequest
2 голосов
/ 01 августа 2011

У меня есть база данных MYSQL с отрицательными числами, заключенными в круглые скобки
например.(14 500), который должен быть -14500.

Я храню цифры как varchar.Я пытаюсь преобразовать все числа в двойной или плавающий формат, а также отформатировать отрицательные числа со знаком минус.
Мой код:

select case 
   when substr(gross_d,1,1) = '(' then
       ltrim('(') and rtrim(')') *-1
   else 
      (gross_d)
   end gross_d_num
from buy;
convert(gross_d_num,Double);

Проблема моего текущего метода в том, что все отрицательные числа с круглыми скобками конвертируются в ноль.Есть ли другой способ получить мой результат.

edit:

Я также удалил * -1, чтобы проверить, удаляются ли скобки, и получаю значение ноль.

Ответы [ 3 ]

3 голосов
/ 01 августа 2011

Что-то вроде

convert (
    case 
       when gross_d LIKE '(%)' THEN CONCAT('-', REPLACE(REPLACE(gross_d, ')', ''), '(', ''))
       else gross_d
    end, decimal(19,6))

Здесь вы обрезаете только круглые скобки. Это становится нулем, когда вы умножаете на -1

ltrim('(') and rtrim(')') *-1
0 голосов
/ 08 марта 2017

В нашей компании мы не контролируем форматирование валюты, используемое внешними сторонами, загружающими таблицы Excel. В настоящее время мы используем это, чтобы конвертировать валюты и добавлять регистр всякий раз, когда появляется что-то новое:

SET @netSale := '$ (154.00)';

SELECT CONVERT (

CASE 
       when @netSale LIKE '$ (%)' THEN CONCAT('-', REPLACE(REPLACE(REPLACE(@netSale, '$ ', ''), ')', ''), '(', ''))
       when @netSale LIKE '(%)' THEN CONCAT('-', REPLACE(REPLACE(REPLACE(@netSale, '$ ', ''), ')', ''), '(', ''))
       else REPLACE(REPLACE(@netSale,'$',''),',', '')
    END, DECIMAL(10,2)
)

Это относится к большинству стилей форматирования, с которыми мы сталкивались, и особенно полезно при загрузке преобразованного файла CSV в таблицу.

0 голосов
/ 01 августа 2011
CONVERT( 
    IF( gross_d LIKE '(%)' 
        ,CONCAT( '-', SUBSTR( gross_d, 1, LENGTH( gross_d ) - 2 ) )
        ,gross_d )
,DECIMAL );
...