Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
ActiveRecord/MySQL选择条件比较字符串组件_Mysql_Ruby On Rails_String_Activerecord_Comparison - Fatal编程技术网

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

ActiveRecord/MySQL选择条件比较字符串组件,mysql,ruby-on-rails,string,activerecord,comparison,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 这是很

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

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个点,则需要对子字符串_INDEXSUBSTRING_INDEXfield,“.”进行大量比较,您可以使用它删除点并将字符串转换为整数:

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

当只有两个组件时,它就工作了,但如果有三个或更多组件,它就会中断:mysql>选择“543.21.5”+0>=“543.21.5”+0;+--------------+|”543.21.5'+0>='543.21.5'+0 |+--------------+| 1 |+--------------+1行,2个警告0.00秒我很糟糕,没有把问题读得很好,假设了有效的浮动。我认为这也不起作用,但这是个好主意。这就是我认为会发生故障的地方。543.21.9>543.2.19应该是真的,但是用你的方法,它是相等的。我接受这个,因为我认为它是最接近答案的。我们最终走了一个稍微不同的方向,但这是一个好的开始。