MySql FIND_IN_SET, SUBSTRING_INDEX, REGEXP正则匹配等字符串替换、截取函数应用

Mysql数据库提供了比较丰富的字符串函数,如上文“谈谈Mysql 字符串连接 CONCAT CONCAT_WS GROUP_CONCAT区别及使用场景”中提到的字符串连接函数,本文继续讲述Mysql剩余常用字符串函数的使用注意事项及使用场景。

1、字符串长度
1)CHAR_LENGTH(str)、CHARACTER_LENGTH(str)

Returns the length of the string str, measured in characters. A multibyte character counts as a single character. This means that for a string containing five 2-byte characters, LENGTH() returns 10, whereas CHAR_LENGTH() returns 5.
返回字符数

2)LENGTH(str)

Returns the length of the string str, measured in bytes. A multibyte character counts as multiple bytes. This means that for a string containing five 2-byte characters, LENGTH() returns 10, whereas CHAR_LENGTH() returns 5.
返回字节长度,不同编码返回结果不同。

select CHAR_LENGTH('中欧d');	->3
select LENGTH('中欧d');			->utf-8, 7
select LENGTH('中欧d');			->gbk, 5
2、字符串查找和替换
1)INSTR(str,substr)

Returns the position of the first occurrence of substring substr in string str. This is the same as the two-argument form of LOCATE(), except that the order of the arguments is reversed.
找到返回>0的值(从1开始计数),否则返回0
参数位置互换,等同LOCATE(substr,str)

2)LOCATE(substr,str),LOCATE(substr,str,pos)**

The first syntax returns the position of the first occurrence of substring substr in string str. The second syntax returns the position of the first occurrence of substring substr in string str, starting at position pos. Returns 0 if substr is not in str. Returns NULL if substr or str is NULL.
找到返回>0(从1开始计数),否则返回0
POSITION函数同LOCATE

SELECT INSTR('foobarbar', 'bar');		-> 4,第一次出现的位置
SELECT INSTR('xbar', 'foobar');		-> 0
SELECT LOCATE('bar', 'foobarbar');		-> 7
SELECT LOCATE('xbar', 'foobar');		-> 0
3)FIND_IN_SET(str,strlist)

Returns a value in the range of 1 to N if the string str is in the string list strlist consisting of N substrings. A string list is a string composed of substrings separated by , characters. If the first argument is a constant string and the second is a column of type SET, the FIND_IN_SET() function is optimized to use bit arithmetic. Returns 0 if str is not in strlist or if strlist is the empty string. Returns NULL if either argument is NULL. This function does not work properly if the first argument contains a comma (,) character.
查找str是否在strlist以逗号连接的字符串中,str不能包含逗号,没找到返回0,找到返回>0值

SELECT FIND_IN_SET('b','a,b,c,d');		-> 2

使用场景:
在之前的博文:“谈谈企业信息系统tag标签数据库设计及基于多选组件bootstrap-select的实现”中曾提到FIND_IN_SET函数使用,如经销商渠道类型是tag标签,有:传统渠道、KA渠道、特通渠道等。查找传统渠道经销商,用FIND_IN_SET函数如下:

select * from sale_customers where FIND_IN_SET('传统渠道', tag_name) > 0
4)REGEXP:expr REGEXP pat, expr RLIKE pat

字符串正则匹配,匹配上返回1,否则返回0

mysql> SELECT 'Monty!' REGEXP '.*'; -> 1, 任意字符
mysql> SELECT 'new*\n*line' REGEXP 'new\\*.\\*line'; -> 1 \\*转义
mysql> SELECT 'a' REGEXP 'A', 'a' REGEXP BINARY 'A'; -> 1 0
mysql> SELECT 'a' REGEXP '^[a-d]'; -> 1, a-d字符开头

更多正则相关内容,请参考:Mysql参考手册5.7 13.5.2 Regular Expressions
因为Mysql字符串替换(replace)时不能使用正则,实际上正则使用率不是很高。

5)replace:replace(object,search,replace)

把object中出现search的全部替换为replace

mysql> update `base_goods` set `py`=replace(`py`,' ',''); //清除产品表中名称拼音字段中的空格  
3、字符串截取
1)SUBSTRING(str,pos),SUBSTRING(strFROMpos),SUBSTRING(str,pos,len),

SUBSTRING(str FROM pos FOR len)
从pos位置开始截取剩余所有字符串或截取长度为len的字符串。pos为负则从字符串右边开始计算位置,如-1则表示右边第1个。
SUBSTR() 同SUBSTRING

mysql> SELECT SUBSTRING('Quadratically',5); -> 'ratically',5个开始余下所有字串
mysql> SELECT SUBSTRING('foobarbar' FROM 4); -> 'barbar',第4个开始余下所有字串
mysql> SELECT SUBSTRING('Quadratically',5,6); -> 'ratica',第5个开始,截取6个字符
mysql> SELECT SUBSTRING('Sakila', -3); -> 'ila',倒数第3个开始,截取右侧所有字符
mysql> SELECT SUBSTRING('Sakila' FROM -4 FOR 2); -> 'ki',倒数第4个开始,截取2个字符
2)SUBSTRING_INDEX(str,delim,count)

Returns the substring from string str before count occurrences of the delimiter delim. If count is positive, everything to the left of the final delimiter (counting from the left) is returned. If count is negative, everything to the right of the final delimiter (counting from the right) is returned. SUBSTRING_INDEX() performs a case-sensitive match when searching for delim.
count > 0, 返回str按delim分割后左侧第count开始左侧字符串
count < 0, 返回str按delim分割后右侧第count开始右侧字符串。

mysql> SELECT SUBSTRING_INDEX('www.mysql.com', '.', 2); -> 'www.mysql'
mysql> SELECT SUBSTRING_INDEX('www.mysql.com', '.', -2); -> 'mysql.com'

由于mysql没有字符串分割函数,SUBSTRING_INDEX是一个可行的替代函数,如截取电话号码、省市区等是一个不错的选择。

### 回答1: 除了使用 FIND_IN_SET 和正则表达式,还有其他几种方法可以将 MySQL 字符串转换为列表: 1. 使用 SUBSTRING_INDEX() 函数:该函数可以按照指定的分隔符将字符串分割成子串,并返回指定位置之前或之后的子串。例如,可以使用以下语句将字符串转换为列表: ``` SELECT SUBSTRING_INDEX('apple,banana,orange', ',', 1) AS item_1, SUBSTRING_INDEX(SUBSTRING_INDEX('apple,banana,orange', ',', 2), ',', -1) AS item_2, SUBSTRING_INDEX('apple,banana,orange', ',', -1) AS item_3; ``` 运行结果为: ``` +--------+--------+--------+ | item_1 | item_2 | item_3 | +--------+--------+--------+ | apple | banana | orange | +--------+--------+--------+ ``` 2. 使用 JSON 函数MySQL 5.7 及以上版本支持 JSON 类型,可以将字符串转换为 JSON 数组,然后使用 JSON 函数将其转换为列表。例如,可以使用以下语句将字符串转换为列表: ``` SELECT JSON_EXTRACT(JSON_ARRAY('apple', 'banana', 'orange'), '$[0]') AS item_1, JSON_EXTRACT(JSON_ARRAY('apple', 'banana', 'orange'), '$[1]') AS item_2, JSON_EXTRACT(JSON_ARRAY('apple', 'banana', 'orange'), '$[2]') AS item_3; ``` 运行结果为: ``` +--------+--------+--------+ | item_1 | item_2 | item_3 | +--------+--------+--------+ | apple | banana | orange | +--------+--------+--------+ ``` 无论使用哪种方法,都需要注意字符串中是否包含空格、逗号等分隔符,并根据实际情况选择合适的分隔符和转换方法。 ### 回答2: 除了使用FIND_IN_SET函数和正则表达式来在MySQL中进行字符串转为列表的方法,还有以下几种方法可以实现: 1. 使用SUBSTRING_INDEX函数:该函数可以根据指定的分隔符将字符串分割成子字符串,并返回指定位置的子字符串。可以通过多次调用该函数来逐步获取每个列表项。例如,假设有一个字符串'apple,banana,orange',可以使用如下的SQL语句来将其转换为列表: ``` SELECT SUBSTRING_INDEX(SUBSTRING_INDEX('apple,banana,orange', ',', 1), ',', -1) AS item1, SUBSTRING_INDEX(SUBSTRING_INDEX('apple,banana,orange', ',', 2), ',', -1) AS item2, SUBSTRING_INDEX(SUBSTRING_INDEX('apple,banana,orange', ',', 3), ',', -1) AS item3; ``` 结果将返回每个列表项的值,即'apple'、'banana'和'orange'。 2. 使用JSON解析函数:如果MySQL版本较新,可以使用JSON解析函数字符串解析为JSON数组,然后通过查询数组元素来获取列表项。例如,可以使用如下的SQL语句将字符串'["apple","banana","orange"]'转换为列表: ``` SELECT JSON_EXTRACT('["apple","banana","orange"]', '$[0]') AS item1, JSON_EXTRACT('["apple","banana","orange"]', '$[1]') AS item2, JSON_EXTRACT('["apple","banana","orange"]', '$[2]') AS item3; ``` 结果将返回每个列表项的值,即'apple'、'banana'和'orange'。 3. 使用自定义函数:如果以上方法不适用,还可以通过自定义函数来实现字符串转列表的功能。可以编写一个自定义函数,接受字符串和分隔符作为输入参数,然后在函数内部使用循环和字符串处理函数来逐步获取每个列表项,并将它们存储在一个临时表中。最后,查询该临时表即可获取转换后的列表项。 ### 回答3: 除了使用FIND_IN_SET和正则表达式,还可以使用SUBSTRING_INDEX函数来实现MySQL字符串转列表的方法。 SUBSTRING_INDEX函数可以用来截取字符串中指定字符之前或之后的部分,并返回截取结果。我们可以利用这个函数来逐步截取字符串中的每个元素,从而实现将字符串转化为列表的效果。 具体实现步骤如下: 1. 使用SUBSTRING_INDEX函数字符串从指定的分隔符处切割成两部分,取得第一个元素; 2. 使用SUBSTRING_INDEX函数将原始字符串从第一个元素切割后的剩余部分继续切割,获取第二个元素; 3. 重复步骤2,直到将所有元素都切割出来。 以下是一个示例SQL查询语句,展示了如何使用SUBSTRING_INDEX函数将逗号分隔的字符串转换为列表: ```sql SELECT SUBSTRING_INDEX(SUBSTRING_INDEX('apple,banana,orange', ',', 1), ',', -1) AS element1, SUBSTRING_INDEX(SUBSTRING_INDEX('apple,banana,orange', ',', 2), ',', -1) AS element2, SUBSTRING_INDEX(SUBSTRING_INDEX('apple,banana,orange', ',', 3), ',', -1) AS element3; ``` 运行以上查询语句将得到如下结果: ``` +----------+----------+----------+ | element1 | element2 | element3 | +----------+----------+----------+ | apple | banana | orange | +----------+----------+----------+ ``` 通过依次调整截取的位置,即可将字符串转化为相应的列表。 需要注意的是,这种方法适用于已知列表中元素的个数,如果列表中元素个数不确定,建议使用其他更灵活的方法来实现。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值