次のようなバージョン情報を含むフィールドがあります。
V12.0
V1.0
BE0.50
VV24
より大きいバージョンを照会したいn
。比較したい番号の前に固定されていない文字数があります。次のようなことは可能ですか:
SELECT version FROM table WHERE int_part(version) > 10
V12.0
VV24
この場合、バージョン番号は末尾にのみ表示され、アルファベットは先頭に表示されるようです。したがって、考えられる解決策は、文字列を逆にし、それを型キャストして数値を取得し、取得した数値を逆に戻すことです。
次の解決策を試してください
SELECT version
FROM table
HAVING CAST(REVERSE(IF(LOCATE(".", version), (CAST(REVERSE(version) AS DECIMAL(4,2))), (CAST(REVERSE(version) AS UNSIGNED INTEGER)))) AS DECIMAL(4,2)) > 12;
それが役に立てば幸い...
これを行うには、独自の関数を作成する必要があるようです:
CREATE FUNCTION IsNumeric (val varchar(255)) RETURNS tinyint
RETURN val REGEXP '^(-|\\+){0,1}([0-9]+\\.[0-9]*|[0-9]*\\.[0-9]+|[0-9]+)$';
CREATE FUNCTION NumericOnly (val VARCHAR(255))
RETURNS VARCHAR(255)
BEGIN
DECLARE idx INT DEFAULT 0;
IF ISNULL(val) THEN RETURN NULL; END IF;
IF LENGTH(val) = 0 THEN RETURN ""; END IF;
SET idx = LENGTH(val);
WHILE idx > 0 DO
IF IsNumeric(SUBSTRING(val,idx,1)) = 0 THEN
SET val = REPLACE(val,SUBSTRING(val,idx,1),"");
SET idx = LENGTH(val)+1;
END IF;
SET idx = idx - 1;
END WHILE;
RETURN val;
END;
select NumericOnly('vv24');
+---------------------+
| NumericOnly('vv24') |
+---------------------+
| 24 |
+---------------------+
MySQL が REPLACE メソッドで正規表現をサポートしていないことの大きな欠点。何らかのマッチングを行う必要がある場合は、通常、すべてのデータを PHP にプルして、そこで処理します。長期的には、それがより良い解決策です。もちろん、必要に応じていつでもユーザー定義関数を使用できます。
http://dev.mysql.com/doc/refman/5.0/en/adding-udf.html
@shubhansh
24 は 0.24 に変化せず、> 12 で失敗しますか?