ActiveRecord / MySQL Выберите условие, сравнивая строковые компоненты - PullRequest
0 голосов
/ 16 июля 2010

У меня есть строка, которая определена как одно или несколько разделенных точками целых чисел, таких как 12345, 543.21, 109.87.654 и т. Д. Я храню значения в базе данных MySQL, а затем мне нужно найти строки, которые сравниваются с предоставленной значение. Я хочу выбрать строки, сравнивая каждый компонент строки с соответствующим компонентом входной строки. Со стандартным сравнением строк в MySQL вот где это ломается:

mysql> SELECT '543.21' >= '500.21' 
-> 1
mysql> SELECT '543.21' >= '5000.21'
-> 1

Это естественно, потому что сравнение строк - это словарное сравнение, которое не учитывает длину строки, но я хочу получить результат 0 для второго запроса.

Есть ли способ дать некоторую подсказку MySQL о том, как их сравнивать? Иначе есть ли способ намека на ActiveRecord, как это сделать для меня? Сейчас лучшее решение, которое я нашел, - это выбрать все строки и затем отфильтровать результаты, используя методы Ruby split и reject. (Весь набор данных довольно мал и вряд ли сильно вырастет в обозримом будущем, поэтому это разумный вариант, но если есть более простой способ, который я не рассматриваю, я был бы рад узнать это.)

Ответы [ 2 ]

0 голосов
/ 17 июля 2010

Вы можете использовать REPLACE для удаления точек и CAST для преобразования строки в целое число:

SELECT CAST(REPLACE("543.21", ".", "") AS SIGNED) >= CAST(REPLACE("5000.21", ".", "") AS SIGNED)
0 голосов
/ 16 июля 2010
mysql> SELECT '543.21' >= '5000.21';
+-----------------------+
| '543.21' >= '5000.21' |
+-----------------------+
|                     1 | 
+-----------------------+
1 row in set (0.00 sec)

mysql> SELECT '543.21'+0 >= '5000.21'+0;
+---------------------------+
| '543.21'+0 >= '5000.21'+0 |
+---------------------------+
|                         0 | 
+---------------------------+
1 row in set (0.00 sec)

Это действительно работает только для действительных чисел с плавающей точкой.Выполнение этого для более чем 1 точки потребует МНОГО сравнения SUBSTRING_INDEX(SUBSTRING_INDEX(field, '.', <positionnumber you're comparing>), '.', -1) (с ручным повторением для максимального количества позиций, которые вы сравниваете)

...