MySQL 字串擷取相關函式總結

pythontab發表於2018-04-09

在工作中,可能需要將某些欄位按某個分割符組成一個字串作為欄位值存取到資料庫表中,比如某個任務對應三個結果,分別儲存在不同的資料表中,這時可以將這三個不同表的主鍵按照約定的順序進行組合(主鍵a:主鍵b:主鍵c)。當需要分別去查任務對應類別的詳情資訊時,可以擷取特定位置的字串(主鍵b) join 表b進行操作。正好最近也遇到這塊操作,特意將 MySQL 字串擷取的相關函式做一個梳理,以便今後回顧。


一、left(str, len)

返回字串 str 自左數的 len 個字元。如果任一引數為 NULL,則返回 NULL。


mysql> select left('pythontab.com', 5);

+---------------------------------------------------------+

| left('pythontab.com', 5) |

+---------------------------------------------------------+

| pytho |

+---------------------------------------------------------+

1 row in set (0.00 sec)


二、right(str, len)

返回 str 右邊末 len 位的字元。如果有的引數是 NULL 值,則返回 NULL。


mysql> select right('pythontab.com', 4);

+---------------------------------------------------------+

| right('pythontab.com', 4) |

+---------------------------------------------------------+

| .com |

+---------------------------------------------------------+

1 row in set (0.00 sec)


三、substring_index(str, delim, count)

返回 str 中第 count 次出現的分隔符 delim 之前的子字串。如果 count 為正數,將最後一個分隔符左邊(因為是從左數分隔符)的所有內容作為子字串返回;如果 count 為負值,返回最後一個分隔符右邊(因為是從右數分隔符)的所有內容作為子字串返回。在尋找分隔符時,函式對大小寫是敏感的。如果在字串 str 中找不到 delim 引數指定的值,就返回整個字串。


mysql> select substring_index('www.pythontab.com', '.', 2);

+---------------------------------------------------------+

| substring_index('www.pythontab.com', '.', 2) |

+---------------------------------------------------------+

| www.pythontab |

+---------------------------------------------------------+

1 row in set (0.00 sec)

mysql> select substring_index('www.pythontab.com', '/', 2);

+---------------------------------------------------------+

| substring_index('www.pythontab.com', '/', 2) |

+---------------------------------------------------------+

| www.pythontab.com |

+---------------------------------------------------------+

1 row in set (0.00 sec)


四、substring() 與 substr()

substring(str, pos)、substring(str from pos)、substring(str, pos, len)、substring(str from pos for len) 比較


在以上4種函式變種形式中,沒有 len 引數的函式形式會返回自 str 中位置 pos 處之後的子字串;有 len 引數的函式形式會返回自 str 中位置 pos 處之後,長度為 len 的子字串。使用 FROM 的函式形式則是採用的標準的 SQL 語法。pos 引數也可能取負值,在這種情況下,取字串的方式是從字串 str 的末尾向前(而非從前往後),從這種逆向順序的 pos 處開始取字串。另外,負值的 pos 引數可用於任何形式的 substring() 函式中。


mysql> select substring('pythontab.com', 6);

+---------------------------------------------------------+

| substring('pythontab.com',6) |

+---------------------------------------------------------+

| ntab.com |

+---------------------------------------------------------+

1 row in set (0.00 sec)

mysql> select substr('pythontab.com' from 6);

+---------------------------------------------------------+

| substr('pythontab.com' from 6) |

+---------------------------------------------------------+

| ntab.com |

+---------------------------------------------------------+

1 row in set (0.00 sec)

mysql> select substring('pythontab.com', -10, 4);

+---------------------------------------------------------+

| substring('pythontab.com', -10, 4) |

+---------------------------------------------------------+

| hont |

+---------------------------------------------------------+

1 row in set (0.00 sec)


五、trim([{both | leading | trailing} [remstr] form] str)

將字串 str去除 remstr 所指定的字首或字尾,返回結果字串。如果沒有指定識別符號both、leading,或trailing,則預設採用 both,即將前字尾都刪除。remstr 其實是個可選引數,如果沒有指定它,則刪除的是空格。

mysql> select trim(' pythontab.com ');

+---------------------------------------------------------+

| trim(' pythontab.com ') |

+---------------------------------------------------------+

| pythontab.com |

+---------------------------------------------------------+

1 row in set (0.00 sec)

mysql> select trim(leading 'www.' from 'www.pythontab.com');

+---------------------------------------------------------+

| trim(leading 'www.' from 'www.pythontab.com') |

+---------------------------------------------------------+

| pythontab.com |

+---------------------------------------------------------+

1 row in set (0.00 sec)

mysql> select trim(both 'www.' from 'www.pythontab.com');

+---------------------------------------------------------+

| trim(both 'www.' from 'www.pythontab.com') |

+---------------------------------------------------------+

| pythontab.com |

+---------------------------------------------------------+

1 row in set (0.00 sec)

mysql> select trim(trailing 'www.' from 'www.pythontab.com');

+---------------------------------------------------------+

| trim(trailing 'www.' from 'www.pythontab.com') |

+---------------------------------------------------------+

| www.pythontab.com |

+---------------------------------------------------------+

1 row in set (0.00 sec)


相關文章