2015-02-17 7 views
1

У меня есть столбец цены, который является строкой и имеет цену для продукта со всего мира, теперь, когда я пытаюсь выполнить любую операцию, такую ​​как сумма, я получаю ошибку. Итак, мой вопрос в том, как я могу удалить символ валюты из столбца цены для всех стран?Как удалить символ валюты из столбца цены?

Вот мой вход образец: -

locale price 
cs_CZ 2462475,38 K 
da_DK kr 591.872,50 
de_AT 267,70 
de_CH CHF 1'998.99 
de_DE 1.798,09 
en_AE AED7,236.20 
en_AU $1,699.00 
en_BD Tk999,999.00 
en_HK HK$6,188.00 
en_HU Ft344,524,655.48 
tr_TR 2.344.697,66 TL 
+2

Не хранить эти символы! Используйте ограничения, правильные типы данных, триггеры и т. Д., Очищайте свои данные при вставке/обновлении! (Теперь у вас также есть десятичная запятая или десятичная запятая ...) – jarlh

+0

Исторические данные уже есть в таблице, поэтому я не могу их очистить. – Sharad

+0

Разрешено ли вам обновлять данные таблицы? Если это меньше, чем миллионы строк, вы можете просто использовать REPLACE снова и снова, пока все разные символы и пробелы валюты не исчезнут, тогда у вас есть проблема с запятой/запятой. Если это всегда два десятичных знака, это легко, иначе, возможно, вы можете посмотреть на третьего символа с конца и посмотреть, является ли это цифрой или нет. – jarlh

ответ

0

Вы, кажется, как десятичную точку и десятичную запятую, но всегда две десятичные (надеюсь, в остальной части данных тоже).

  1. Вы можете начать с размещения этих значений в списке значений для тестирования (при необходимости добавьте лишние одинарные кавычки).
  2. Затем вам нужно обрезать пробелы и буквы с помощью регулярных выражений. Во внутреннем SELECT вы получаете подстроку с одинарными кавычками и запятыми для тысяч разделителей.
  3. В внешнем SELECT вы заменяете десятичные запятые в десятичной части и выделяете тысячи разделителей на целочисленной стороне. Результат приводится к типу числовой, с которым вы можете рассчитывать суммы и т.д.

    SELECT (
        regexp_replace(left(substring, length(substring) -3),'[.,'']','','g') 
         || replace(right(substring, 3),',','.'))::numeric, 
        * 
        FROM (
         SELECT substring(column1 from '(([0-9]+[,.''])*[0-9]+[.,][0-9]{2})[^0-9]*$'), 
         column1 
         FROM (
          VALUES ('2462475,38 K'), 
           ('kr 591.872,50'), 
           ('267,70'), 
           ('CHF 1''998.99'), 
           ('1.798,09'), 
           ('AED7,236.20'), 
           ('$1,699.00'), 
           ('Tk999,999.00'), 
           ('HK$6,188.00'), 
           ('Ft344,524,655.48'), 
           ('2.344.697,66 TL') 
         ) currencies 
        ) sq1; 
    

Далее приведен полный ответ совместим с 9.0 версии PostgreSQL (без левой() или вправо() функций, используемых). Также список значений заменяется на запрос SELECT, который вы можете заменить своей собственной таблицей и столбцом. Наконец, все это было заключено в запрос SELECT, который демонстрирует использование sum-функции.

SELECT sum(numeric) FROM (
    SELECT (
     regexp_replace(substr(substring, 0, length(substring) -3),'[.,'']','','g') 
      || replace(substr(substring, length(substring) -3, length(substring)),',','.'))::numeric, 
     * 
     FROM (
      SELECT substring(column1 from '(([0-9]+[,.''])*[0-9]+[.,][0-9]{2})[^0-9]*$'), 
       column1 
       FROM (
        SELECT column1 FROM your_table 
       ) currencies 
     ) sq1 
    ) sq2 
+0

Я попытался выполнить над запросом, но его ошибку бросания. – Sharad

+0

Какая ошибка? Если версия PostgreSQL слишком устарела для распознавания левых и правых функций, вы можете, например, заменить left() - function на: 'substr (substring, 0, length (substring) -3)' и right() - function с: 'substr (подстрока, длина (подстрока) -3, длина (подстрока))' Если это что-то еще, опишите сообщение об ошибке. –

0

Postgres разгружает большую часть обработки локалей операционной системой. Таким образом, процедуры конвертации валют Postgres будут работать только для вас, если ОС понимает имена локали, а ваши ценовые строки соответствуют ожидаемому формату.

Например, Windows не будет принимать da_DK как местности, и даже если это так, он не будет принимать строку kr 591.872,50, как он ожидает, что символ валюты Датская быть kr. вместо kr.

То есть, я думаю, что это должно работать хорошо на сервере под управлением Linux на базе:

CREATE FUNCTION convert_currency(amount TEXT, locale TEXT) RETURNS NUMERIC AS 
$$ 
BEGIN 
    PERFORM set_config('lc_monetary', locale || '.UTF-8', True); 
    RETURN amount::MONEY::NUMERIC; 
END 
$$ 
LANGUAGE plpgsql 
SET lc_monetary TO DEFAULT;