ActiveRecord / MySQL选择条件比较字符串组件

时间:2010-07-16 14:33:01

标签: mysql ruby-on-rails string activerecord comparison

我有一个字符串被定义为一个或多个点分隔的整数,如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的splitreject方法过滤结果。 (整个数据集非常小,在可预见的未来不太可能增长太多,所以这是一个合理的选择,但如果有一种更简单的方法,我不会考虑我会很高兴知道它。)

2 个答案:

答案 0 :(得分:0)

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)进行大量比较(对于您要比较的最大位置数,需要手动重复)

答案 1 :(得分:0)

您可以使用REPLACE删除点,使用CAST将字符串转换为整数:

SELECT CAST(REPLACE("543.21", ".", "") AS SIGNED) >= CAST(REPLACE("5000.21", ".", "") AS SIGNED)