MySql 字符串中提取數(shù)字的實(shí)現(xiàn)示例
一、前言
在MySQL中,有時(shí)需要從字符串中提取數(shù)字。在這種情況下,我們可以使用一些函數(shù)來(lái)實(shí)現(xiàn)該效果。但是,這些函數(shù)中的一些可能會(huì)提取字符串中的所有數(shù)字,而其他函數(shù)可能只會(huì)提取最長(zhǎng)的數(shù)字字符序列。因此,我們需要了解每個(gè)函數(shù)的行為及其應(yīng)用場(chǎng)景。
二、mysql 內(nèi)置函數(shù)
1. REGEXP_REPLACE()函數(shù)
REGEXP_REPLACE()函數(shù)可以用于從字符串中刪除任何不是數(shù)字的字符,留下數(shù)字字符。以下是一個(gè)例子:
SELECT REGEXP_REPLACE("abc123def456", '[^0-9]', ''); // Output: 123456
其中的正則表達(dá)式[^0-9]
表示是否出現(xiàn)除0-9以外的字符,替換掉原來(lái)的字符串中的所有非數(shù)字字符。
2. REGEXP_SUBSTR()函數(shù)
REGEXP_SUBSTR()函數(shù)可以用于從字符串中提取匹配正則表達(dá)式的字串。以下是一個(gè)例子:
SELECT REGEXP_SUBSTR("name123_phone456", '[0-9]+'); // Output: 123
其中的正則表達(dá)式[0-9]+
表示會(huì)選擇字符串中的一個(gè)或多個(gè)數(shù)字。
3. SUBSTRING()函數(shù)結(jié)合正則表達(dá)式
另一種方法是使用SUBSTRING()函數(shù)和正則表達(dá)式,可以從字符串中提取數(shù)字序列。以下是一個(gè)例子:
SELECT SUBSTRING("abc123def456",LOCATE("123", "abc123def456"), LOCATE("456", "abc123def456")-LOCATE("123", "abc123def456")+1); // Output: 123def456
其中LOCATE()函數(shù)用于找到字符串中某個(gè)子字符串的位置,然后使用SUBSTRING()函數(shù)從該位置開(kāi)始提取包含在“123”和“456”之間的字符串。如果你想要提取數(shù)字序列,請(qǐng)使用正則表達(dá)式。
三、自定義函數(shù)
下面是一個(gè)基于循環(huán)的MySQL自定義函數(shù),用于從輸入的字符串中提取所有數(shù)字字符并將其組合成一個(gè)整數(shù):
一、函數(shù)1
DROP FUNCTION IF EXISTS `number_extract`; DELIMITER $$ CREATE FUNCTION `number_extract`(string_inport VARCHAR(255)) RETURNS INT NO SQL BEGIN DECLARE ctrNumber VARCHAR(255); DECLARE finNumber VARCHAR(255) DEFAULT ''; DECLARE sChar VARCHAR(1); DECLARE inti INTEGER DEFAULT 1; IF LENGTH(string_inport) > 0 THEN WHILE(inti <= LENGTH(string_inport)) DO SET sChar = SUBSTRING(string_inport, inti, 1); SET ctrNumber = FIND_IN_SET(sChar, '0,1,2,3,4,5,6,7,8,9'); IF ctrNumber > 0 THEN SET finNumber = CONCAT(finNumber, sChar); END IF; SET inti = inti + 1; END WHILE; RETURN CAST(finNumber AS UNSIGNED); ELSE RETURN 0; END IF; END$$ DELIMITER ;
該函數(shù)接受一個(gè)VARCHAR(255)類(lèi)型的字符串參數(shù),并返回一個(gè)整數(shù)值。函數(shù)使用了一個(gè)while循環(huán)來(lái)遍歷字符串中的每個(gè)字符。如果字符是數(shù)字,則將其添加到finNumber字符串中。在循環(huán)結(jié)束后,使用MySQL內(nèi)置的CAST()函數(shù)將finNumber字符串轉(zhuǎn)換為整數(shù)類(lèi)型。
二、函數(shù)2
如果需要從輸入的字符串中提取特定數(shù)量的連續(xù)數(shù)字字符并將其組合成一個(gè)整數(shù),我們可以使用兩個(gè)自定義函數(shù)。
DROP FUNCTION IF EXISTS `number_extract_n1`; DELIMITER $$ CREATE FUNCTION `number_extract_n1`(string_inport VARCHAR(255), num_digits INT) RETURNS INT NO SQL BEGIN DECLARE ctrNumber VARCHAR(255); DECLARE finNumber VARCHAR(255) DEFAULT ''; DECLARE sChar VARCHAR(1); DECLARE inti INTEGER DEFAULT 1; IF LENGTH(string_inport) > 0 AND num_digits > 0 THEN WHILE(inti <= LENGTH(string_inport)) DO SET sChar = SUBSTRING(string_inport, inti, 1); SET ctrNumber = FIND_IN_SET(sChar, '0,1,2,3,4,5,6,7,8,9'); IF ctrNumber > 0 THEN SET finNumber = CONCAT(finNumber, sChar); IF LENGTH(finNumber) = num_digits THEN SET inti = LENGTH(string_inport)+1; END IF; END IF; SET inti = inti + 1; END WHILE; RETURN CAST(finNumber AS UNSIGNED); ELSE RETURN 0; END IF; END$$ DELIMITER ;
該函數(shù)接受兩個(gè)參數(shù),一個(gè)VARCHAR(255)類(lèi)型的字符串和一個(gè)INT類(lèi)型的數(shù)字。函數(shù)返回一個(gè)整數(shù),該整數(shù)由輸入字符串中的指定數(shù)量的連續(xù)數(shù)字字符組成。
函數(shù)遍歷輸入的字符串并掃描每個(gè)字符,如果字符是數(shù)字,則將其添加到finNumber字符串中。在finNumber中包含所需數(shù)量的數(shù)字字符時(shí),函數(shù)將循環(huán)終止并返回finNumber轉(zhuǎn)換為整數(shù)類(lèi)型的值。
三、函數(shù)3
DROP FUNCTION IF EXISTS `number_extract_n2`; DELIMITER $$ CREATE FUNCTION `number_extract_n2`(string_inport VARCHAR(255), start_idx INT, num_digits INT) RETURNS INT NO SQL BEGIN DECLARE ctrNumber VARCHAR(255); DECLARE finNumber VARCHAR(255) DEFAULT ''; DECLARE sChar VARCHAR(1); DECLARE inti INTEGER DEFAULT start_idx; DECLARE end_idx INTEGER DEFAULT start_idx + num_digits; IF LENGTH(string_inport) > 0 AND num_digits > 0 AND end_idx <= LENGTH(string_inport) THEN WHILE(inti <= end_idx) DO SET sChar = SUBSTRING(string_inport, inti, 1); SET ctrNumber = FIND_IN_SET(sChar, '0,1,2,3,4,5,6,7,8,9'); IF ctrNumber > 0 THEN SET finNumber = CONCAT(finNumber, sChar); ELSE RETURN 0; END IF; SET inti = inti + 1; END WHILE; RETURN CAST(finNumber AS UNSIGNED); ELSE RETURN 0; END IF; END$$ DELIMITER ;
該函數(shù)接受三個(gè)參數(shù),一個(gè)VARCHAR(255)類(lèi)型的字符串,一個(gè)INT類(lèi)型的數(shù)字表示起始索引值,一個(gè)INT類(lèi)型的數(shù)字表示要提取的數(shù)字字符的數(shù)量。
函數(shù)遍歷輸入字符串的子字符串,并掃描每個(gè)字符,如果字符是數(shù)字,則將其添加到finNumber字符串中。如果finNumber包含所需數(shù)量的數(shù)字字符,則函數(shù)將返回finNumber字符串轉(zhuǎn)換為整數(shù)類(lèi)型的值。如果沒(méi)有提取到足夠數(shù)量的連續(xù)數(shù)字字符,函數(shù)將返回0。
四、后語(yǔ)
我們介紹了三個(gè)自定義函數(shù)以及MySQL內(nèi)置函數(shù)REGEXP_REPLACE()、REGEXP_SUBSTR()和SUBSTRING(),這些函數(shù)可以從輸入的字符串中提取數(shù)字。我們還了解了每個(gè)函數(shù)的行為及其應(yīng)用場(chǎng)景。
REGEXP_REPLACE()函數(shù)可用于從字符串中刪除任何不是數(shù)字的字符,留下數(shù)字字符。
REGEXP_SUBSTR()函數(shù)可用于從字符串中提取匹配正則表達(dá)式的字串。
SUBSTRING()函數(shù)結(jié)合正則表達(dá)式可以從字符串中提取數(shù)字序列。
自定義函數(shù)1可以從字符串中提取所有數(shù)字字符并將其組合成一個(gè)整數(shù)。
自定義函數(shù)2和3可用于從輸入的字符串中提取連續(xù)數(shù)字字符,并將其組合成一個(gè)指定數(shù)量的整數(shù)。
選擇適當(dāng)?shù)暮瘮?shù)來(lái)提取數(shù)字字符是十分重要的,取決于我們需要哪些數(shù)字字符以及是否必須是連續(xù)的數(shù)字字符。在實(shí)際應(yīng)用中,應(yīng)該根據(jù)實(shí)際情況進(jìn)行選擇,以便快速高效地實(shí)現(xiàn)所需的結(jié)果。
到此這篇關(guān)于MySql 字符串中提取數(shù)字的實(shí)現(xiàn)示例的文章就介紹到這了,更多相關(guān)MySql 字符串提取數(shù)字內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
IDEA連接mysql時(shí)區(qū)問(wèn)題解決
在使用MySQL數(shù)據(jù)庫(kù)時(shí),經(jīng)常會(huì)遇到需要設(shè)置時(shí)區(qū)的情況,本文主要介紹了IDEA連接mysql時(shí)區(qū)問(wèn)題解決,具有一定的參考價(jià)值,感興趣的可以了解一下2024-06-06MySQL數(shù)據(jù)庫(kù)Shell import_table數(shù)據(jù)導(dǎo)入
本文我們介紹一款高效的數(shù)據(jù)導(dǎo)入工具,MySQL Shell 工具集中的import_table,該工具的全稱(chēng)是Parallel Table Import Utility,需要的朋友請(qǐng)參考下文2021-08-08MySQL異常恢復(fù)之無(wú)主鍵情況下innodb數(shù)據(jù)恢復(fù)的方法
這篇文章主要介紹了MySQL異?;謴?fù)之無(wú)主鍵情況下innodb數(shù)據(jù)恢復(fù)的方法,結(jié)合實(shí)例形式分析了針對(duì)innodb引擎無(wú)主鍵的情況下恢復(fù)數(shù)據(jù)的步驟與相關(guān)技巧,需要的朋友可以參考下2016-04-04MySQL之FIND_IN_SET()的用法及說(shuō)明
這篇文章主要介紹了MySQL之FIND_IN_SET()的用法及說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-01-01