2015-08-27 2 views
2

У меня есть столбец priority_value в одной из таблиц MySQL, и теперь мне нужно сделать сортировку на основе этого. Этот столбец является фактически VARCHAR и имеет символы валюты, прикрепленные к нему. Но не для всех значений. Символом валюты может быть доллар США (знак доллара), POUND или INR (символ рупии). Так что в настоящее время порядок не работает должным образом. Как я могу исправить это, не удаляя символ валюты вручную?ORDER BY для значений валюты

Вот некоторые выборочные значения в колонке:

.50 
£10 
£100 
$15 
$20 
£25 
£50 
10 
₹30 
+0

Можете ли вы показать выборки данных для вашего столбца таблицы? –

+0

@RahulTripathi отредактировал вопрос –

ответ

1

Вам нужно два столбца:

  • один для значения, поплавок/двойной (или целое число), которые могут быть заказаны, используемые в операциях, таких как суммы и т. д.
  • один для валюты (символ (3), следующий ISO 4217 standard), используемый для других целей (отображение, возможно, преобразование и т. д.)

Сохранение как значения, так и символа внутри varchar не имеет смысла, тем более, что позиция символа валюты варьируется от страны к стране (может быть в начале или в конце), может существовать пробел между символом и значение, или нет, и т.д.

Это, как говорится, если вы не хотите, чтобы изменить таблицу, что-то подобное может работать:

ORDER BY CAST(
    REPLACE(REPLACE(REPLACE(thecolumn,'$',''),'£',''),'₹','') 
    AS DECIMAL(10,2) 
) 
+0

Да. На самом деле это сделал кто-то другой. Я изменил его на другую правильно отформатированную таблицу. Но мне нужно это для некоторых целей отчетности. –

+0

@HappyCoder Что касается второй части моего ответа? – rlanvin

+0

Да, я пытаюсь с этим только :) –

0

Это работало для меня ...

Я создал таблицу с примерно 15 строками, некоторые из которых содержат символы ($, £, €), а некоторые нет. Я создал расчетное поле CAST как DECIMAL, затем я проверяю самый левый символ, чтобы увидеть, можно ли его отливать в виде числа, если мы проверим самый правый символ, так как некоторые валюты помещают символ в конец. Если правый символ равен> 0, мы используем значение priority_value, иначе мы берем левые символы. Вернемся к первому оператору IF, если он не больше 0, что означает, что он либо ведет с 0 (что не имеет значения), либо было не числом (в данном случае денежным символом), поэтому мы принимаем самый правый текст. Наконец, мы закрываем поле CAST и сортируем его. Вы можете поместить это как вычисленное поле или как ORDER BY. Я сказал это двумя способами ниже.

SELECT prize_value, 
     CAST(IF(LEFT(test.prize_value,1) IN ('.',','), 
      REPLACE(test.prize_value,LEFT(test.prize_value,1),'0.'), 
      IF(CAST(LEFT(test.prize_value, 1) AS DECIMAL(10,2)) > 0, 
       IF(CAST(RIGHT(test.prize_value, 1) AS DECIMAL(10,2)) > 0, 
        test.prize_value, 
        LEFT(test.prize_value, LENGTH(test.prize_value) - 1) 
       ), 
       RIGHT(test.prize_value, LENGTH(test.prize_value) - 1) 
      ) 
      ) 
     AS DECIMAL(10,2)) AS prize_value_only 
    FROM chatter.test 
ORDER BY prize_value_only ASC 

--- ИЛИ ---

SELECT prize_value 
    FROM chatter.test 
ORDER BY 
     CAST(IF(LEFT(test.prize_value,1) IN ('.',','), 
      REPLACE(test.prize_value,LEFT(test.prize_value,1),'0.'), 
      IF(CAST(LEFT(test.prize_value, 1) AS DECIMAL(10,2)) > 0, 
       IF(CAST(RIGHT(test.prize_value, 1) AS DECIMAL(10,2)) > 0, 
        test.prize_value, 
        LEFT(test.prize_value, LENGTH(test.prize_value) - 1) 
       ), 
       RIGHT(test.prize_value, LENGTH(test.prize_value) - 1) 
      ) 
      ) AS DECIMAL(10,2)) ASC