2010-03-19 4 views
0

У меня есть стол с полем value, который является varchar(255). Содержимое поля может быть самым разнообразным:Есть ли способ изменить столбец до его заказа в MySQL?

  • $1.20
  • $2994
  • $56 + tax (Это можно игнорировать или усекается до $56 при необходимости)

Я запрос построен:

SELECT value FROM unnamed_table ORDER BY value 

Однако, это, конечно, использует сравнение строк ASCII для упорядочения результатов и не использует никакого численного типа сравнения.

Есть ли способ действительно заказ по значению без изменения типа поля в DECIMAL или что-то другое? Другими словами, может ли быть изменено поле value ('$' удалено, значение преобразовано в десятичное) на лету, прежде чем результаты будут отсортированы?

ответ

1

Вы можете сортировать по выражению сделал для «разбора» текст в десятичную

SELECT value FROM unnamed_table ORDER BY expression_returning_decimal(value) 

Если ваше выражение использует функции MySQL для извлечения числа из строки в зависимости от формы, которую вы ожидаете от нее (что-то вроде CAST (значение AS DECIMAL (10,2)), но вам, вероятно, придется иметь дело с посторонними, -коммерческие символы, так как я не уверен, что CAST будет g если вы не снимаете их).

+0

Я только что перешел на 'int', потому что в противном случае это получилось бы довольно уродливым. Но ваш ответ ближе всего к тому, что я искал. –

1

Создайте второй столбец без $ -знака, выполните сортировку по нему и используйте данные исходного столбца в своем приложении.

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

SELECT value, CAST(SUBSTR(value, 2) AS UNSIGNED) sort_col 
    FROM unnamed_table ORDER BY sort_col 
+0

Есть ли простой способ синхронизировать их? –

+0

Вы не можете создать столбец, назовите его и использовать его как поле для другого столбца. Но вы можете создать (сохраненную) функцию для вычисления значения и использовать его для обоих столбцов, без изменений для сортировки, и один с $ -sign, объединенным перед значением, которое будет использоваться в приложении. (Возможно, было бы удобнее просто добавить $ -sign к значению * в * приложении) – Veger

+0

Я начинаю думать, что единственным вариантом является переход на DECIMAL или INT (и деление на 100). –

Смежные вопросы