Varchar 列に、常にいくつかの数字で終わるテキストがあります。たとえば、次のようになります。
abc12
xy2
asdf876
qwerty32
これらの数値が数値 x より大きい値を選択する必要があります。たとえば、 の場合x = 20
、結果は次のようになります。
asdf876
qwerty32
MySQLでこれを行うことはできますか? どんな助けでも大歓迎です。
Varchar 列に、常にいくつかの数字で終わるテキストがあります。たとえば、次のようになります。
abc12
xy2
asdf876
qwerty32
これらの数値が数値 x より大きい値を選択する必要があります。たとえば、 の場合x = 20
、結果は次のようになります。
asdf876
qwerty32
MySQLでこれを行うことはできますか? どんな助けでも大歓迎です。
まず第一に、そのような操作の必要性は、データベース構造が最初から間違っていたことを示唆しています。
文字列から数値シーケンスを抽出し、それを数値に変換してから、必要な操作を行う関数を作成できます。
たとえば、正規表現を使用します(この問題は、追加のライブラリを使用するmysqlで解決されています)。
ライブラリの追加が難しすぎる場合は、文字列内の最初の数字と、この位置から最後までのsubstrを検出する関数を記述できます。
グーグルで調べた後、関数でこれを解決する人を見つけました:
mysql> DELIMITER |
mysql> CREATE FUNCTION digits( str CHAR(32) ) RETURNS CHAR(32)
-> BEGIN
-> DECLARE i, len SMALLINT DEFAULT 1;
-> DECLARE ret CHAR(32) DEFAULT '';
-> DECLARE c CHAR(1);
-> SET len = CHAR_LENGTH( str );
-> REPEAT
-> BEGIN
-> SET c = MID( str, i, 1 );
-> IF c BETWEEN '0' AND '9' THEN
-> SET ret=CONCAT(ret,c);
-> END IF;
-> SET i = i + 1;
-> END;
-> UNTIL i > len END REPEAT;
-> RETURN ret;
-> END |
Query OK, 0 rows affected (0.00 sec)
mysql> DELIMITER ;
そしてそれを使用するには:
mysql> select * from t1 where actor_id > digits('ABCDefg199');
+----------+------------+-----------+---------------------+
| actor_id | first_name | last_name | last_update |
+----------+------------+-----------+---------------------+
| 206 | a | b | 0000-00-00 00:00:00 |
| 200 | THORA | TEMPLE | 2012-05-22 15:12:26 |
+----------+------------+-----------+---------------------+
2 rows in set (0.12 sec)
ソース: http://www.artfulsoftware.com/infotree/queries.php?&bw=1280#815