1

次のようなバージョン情報を含むフィールドがあります。

V12.0
V1.0
BE0.50
VV24

より大きいバージョンを照会したいn。比較したい番号の前に固定されていない文字数があります。次のようなことは可能ですか:

SELECT version FROM table WHERE int_part(version) > 10

V12.0
VV24
4

3 に答える 3

2

この場合、バージョン番号は末尾にのみ表示され、アルファベットは先頭に表示されるようです。したがって、考えられる解決策は、文字列を逆にし、それを型キャストして数値を取得し、取得した数値を逆に戻すことです。

次の解決策を試してください

     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;

それが役に立てば幸い...

于 2012-12-14T09:49:54.900 に答える
1

これを行うには、独自の関数を作成する必要があるようです:

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                  |
+---------------------+
于 2012-12-14T09:55:58.743 に答える
0

MySQL が REPLACE メソッドで正規表現をサポートしていないことの大きな欠点。何らかのマッチングを行う必要がある場合は、通常、すべてのデータを PHP にプルして、そこで処理します。長期的には、それがより良い解決策です。もちろん、必要に応じていつでもユーザー定義関数を使用できます。

http://dev.mysql.com/doc/refman/5.0/en/adding-udf.html

@shubhansh

24 は 0.24 に変化せず、> 12 で失敗しますか?

于 2012-12-14T09:51:52.847 に答える