2017-01-28 6 views
0

Я хотел бы сравнить две строки как числа в MySQL. У меня есть следующие данные в моей таблице:Как сравнить два числа как строки в MySQL?

0,15 kg 0,52 kg 0,68 kg 1,24 kg

Теперь я хотел бы сравнить строку с этими данными. То, что я попытался это:

SELECT * FROM `foobar` WHERE weight+0.0 <= '0,7 kg' 

Поскольку MySQL, кажется, не понимает запятую в качестве десятичного разделителя Я попытался заменить его с точкой:

SELECT * FROM `foobar` WHERE REPLACE(weight+0.0,',','.') <= REPLACE('0,7 kg',',','.') 

Однако я всегда получаю странные результаты, включая номера, которые являются больше 0,7. Как ни странно, когда я пытаюсь заказать колонку весов, правильность заказа!

+4

Просто храните данные правильно – Strawberry

+0

Конечно, вы должны отделить его, как упомянуто в Strawberry. Но mysql способен сортировать это. Например, 'где foo> '0,52'' работает. – Alex2php

+0

Да, я знаю, что его нужно хранить по-другому. Сортировка не работает должным образом, если за номером есть «кг». – phpheini

ответ

1

Использование построить CAST (VAL AS DECIMAL (10,2))

SELECT * FROM `foobar ` 
WHERE CAST(REPLACE(weight,',','.') AS DECIMAL(10,2)) <= CAST(REPLACE('0,7 kg',',','.') AS DECIMAL(10,2)); 

Запрос был испытан и дает правильные результаты.

Это решение не может использовать индексы. Лучшим подходом является запрос на временные таблицы, заполненные вычисленными данными. Или вы можете добавить индексированный столбец weight_dec DECIMAL в эту таблицу и использовать триггер для заполнения данных на основе веса. Затем запрос с использованием weight_dec.

+0

Удивительно, спасибо! Знаете ли вы, будут ли эти две операции стоить много производительности или нормально использовать это в производстве? – phpheini

+1

Я думаю, что это стоит того, но вы сказали, что придерживаетесь этого дизайна db. Не забудьте отметить как ответ :) –

+1

@phpheini ** any ** запрос, когда значение столбца используется в качестве аргумента функции или в сочетании с оператором (например, вес + 0) в предложении WHERE, накладывает серьезное снижение производительности в масштабе, поскольку оно заставляет сканирование таблицы оценивать функцию против каждая строка, предотвращая использование любого индекса в рассматриваемом столбце в любой СУБД (а не только в MySQL). Вы никогда не должны писать такие запросы. Однако, если вы делаете что-либо подобное, тогда этот запрос не будет работать хуже, чем любой другой. Вам нужно исправить свой дизайн. До тех пор это правильное решение. –

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

  • Нет связанных вопросов^_^