MySQL字串中抽取數值的方法

datapeng發表於2017-11-13


MySQL的字串函式非常多,以至於有時候我不知道該如何靈活的使用這些函式。

字串基本資訊函式     collation  convert,char_length等

加密函式   password(x),encode,  aes_encrypt

字串連線函式   concat(x1,x2,….)

修剪函式  trim,ltrim,rtrim
子字串操作函式 substring(x,start,length),mid(x,start,length)

字串複製函式  repeat,space

字串比較函式  strcmp
字串逆序函式 reverse

如果真給一個場景,還真說不定能夠拍胸脯適合。

假設我有如下的需求,比如郵箱註冊賬號,指定賬號是以數字開頭,內容如下:

1234@mail.com

012345@aa.mail.com

1234mm@mail.com

1234test@mail.com

如果需要把裡面的數字提取出來,有什麼好的辦法呢。

如果使用字串函式,一種方式就是使用正則,或者直接給定條件來做過濾。

比如replace(xxxx,right(xxx))

還有一種思路就是建立一個函式或者儲存過程,透過結構化的方法來做轉換。

如上的幾種方法其實都比較麻煩,還有什麼辦法呢,我就舉一反三,給出兩個來。

第一個解法就是使用字串的資料型別轉換。

比如:

mysql> select cast('123456@xx.com' as unsigned);
+------------------------------------+
| cast('123456@xx.com' as unsigned) |
+------------------------------------+
|                             123456 |
+------------------------------------+
1 row in set, 1 warning (0.00 sec)

我們可以很明顯看到結果和一個警告。

mysql> show warnings;
+---------+------+-----------------------------------------------------+
| Level   | Code | Message                                             |
+---------+------+-----------------------------------------------------+
| Warning | 1292 | Truncated incorrect INTEGER value: '123456@163.com' |
+---------+------+-----------------------------------------------------+
1 row in set (0.00 sec)

解法二:

這個解法更簡單,有種鬼斧神工的感覺。
mysql> select -(-'123456@163.com');
+----------------------+
| -(-'123456@163.com') |
+----------------------+
|               123456 |
+----------------------+
1 row in set, 1 warning (0.00 sec)

如果是前面含有冗餘的數字,也是可以轉換的。

mysql> select -(-'012345@aa.mail.com');
+--------------------------+
| -(-'012345@aa.mail.com') |
+--------------------------+
|                    12345 |
+--------------------------+
1 row in set, 1 warning (0.00 sec)


大家如果有更好的辦法,歡迎拍磚。


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29371470/viewspace-2147170/,如需轉載,請註明出處,否則將追究法律責任。

相關文章