2010-07-16 3 views
0

12345, 543.21, 109.87.654 등과 같이 하나 이상의 점으로 구분 된 정수로 정의 된 문자열이 있습니다. MySQL 데이터베이스에 값을 저장하고 있어야합니다. 제공된 값과 비교하는 행을 찾습니다. 내가 원하는 것은 문자열의 각 구성 요소를 입력 문자열의 해당 구성 요소와 비교하여 행을 선택하는 것입니다. 이 고장 곳 MySQL의 표준 문자열 비교로, 여기 :ActiveRecord/MySQL 조건 선택 문자열 구성 요소 비교

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

문자열 비교 문자열 길이를 고려하지 않는 "사전"비교이기 때문에 이것은 자연입니다,하지만 난에 0 결과를 원하는 두 번째 쿼리.

MySQL과 비교하는 방법에 대한 힌트를 제공 할 방법이 있습니까? 그렇지 않으면 ActiveRecord에이 작업을 수행하는 방법을 알려줄 수 있습니까? 지금 당장 가장 좋은 해결책은 모든 행을 선택하고 Ruby의 splitreject 메서드를 사용하여 결과를 필터링하는 것입니다. (전체 데이터 세트는 아주 작아서 가까운 미래에 끔찍하게 커질 가능성이 거의 없기 때문에 합리적인 선택이지만, 고려하지 않은 간단한 방법이 있다면 기꺼이 알게 될 것입니다.)

+0

그 점들이 필요합니까? – klew

답변

0

당신은 점을 제거하기 위해 REPLACE을 사용할 수 있으며 CAST (위치의 당신이 비교하는 최대 수에 대한 설명서를 반복 포함) SUBSTRING_INDEX(SUBSTRING_INDEX(field, '.', <positionnumber you're comparing>), '.', -1)의 비교를 많이 필요 :

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

이 방법도 효과가 없을 것이라고 생각하지만 좋은 생각입니다. 여기에 이것이 분해 될 것이라고 생각합니다. '543.21.9> 543.2.19'는 참이어야하지만, 사용자의 방법을 사용하면 동일합니다. – jxpx777

+0

답변에 가장 가까운 것 같아서이 하나를 수락합니다. 우리는 약간 다른 방향으로가는 것을 끝내었지만 이것이 좋은 출발점입니다. – jxpx777

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 점을 위해 그것을 이렇게하면 정수로 문자열을 변환 할

+0

두 개의 구성 요소 만있을 때 작동하지만 세 개 이상이 분리 된 경우 작동합니다. mysql> SELECT '543.21.5'+ 0> = '543.21.5'+ 0; + ------------------------------ + | '543.21.5'+ 0> = '543.21.5'+ 0 | + ------------------------------ + | 1 | + ------------------------------ + 세트 1 행, 경고 2 개 (0.00 초) – jxpx777

+0

불량, 불량 올바른 질문을 모두 읽지 않고 유효한 수레를 사용했습니다. – Wrikken