Преобразование отрицательного числа со скобками в минус в MYSQL

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

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

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

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

редактировать:

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


person firstever    schedule 01.08.2011    source источник
comment
это потому, что ltrim('(') and rtrim(')') * -1 всегда равно нулю, независимо от того, что такое Gros_d.   -  person nobody    schedule 01.08.2011


Ответы (2)


Что-то типа

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

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

ltrim('(') and rtrim(')') *-1
person gbn    schedule 01.08.2011
comment
Я попытался использовать код, но в строке 5 MYSQL сообщает, что в синтаксисе есть ошибка. Я также добавил в код select и from. Я попытался использовать приведение, и я получил ту же ошибку. - person firstever; 01.08.2011
comment
Я удалил оператор convert и попробовал его, просто выбрав регистр, и отрицательные числа представлены отлично. Я собираюсь посмотреть, как использовать операторы convert или cast, и опубликую свое рабочее решение. - person firstever; 01.08.2011
comment
спасибо за вашу помощь, это сработало. Мне пришлось сначала удалить все запятые из каждого значения в столбце. Я использовал SET field_name = replace( replace(field_name, ',', ''), '', '' ). Затем я использовал процедуру преобразования. Спасибо еще раз! - person firstever; 01.08.2011
comment
@Lastever: пожалуйста. Пожалуйста, проголосуйте за и/или примите мой ответ (значок вверх и галочка слева) - person gbn; 01.08.2011

В нашей компании мы не контролируем форматирование валюты, используемое внешними сторонами, загружающими таблицы 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-файла в таблицу.

person Patrick.SE    schedule 07.03.2017