📅  最后修改于: 2023-12-03 15:07:56.442000             🧑  作者: Mango
在某些业务场景下,我们需要在 SQL 中将用户的姓名拆分为名字和姓氏,以便进行更精细的数据处理。以下是几种实现的方法。
SUBSTRING_INDEX(expr,delim,count)
函数能够从一个字符串(或字段)中获取指定个数的子字符串,使用的分隔符为第二个参数。当 count 为正数时,返回的是从左侧开始的子字符串;当 count 为负数时,返回的是从右侧开始的子字符串。
SELECT
SUBSTRING_INDEX('Feng, Sophia', ', ', -1) AS first_name,
SUBSTRING_INDEX('Feng, Sophia', ', ', 1) AS last_name
输出:
+------------+-----------+
| first_name | last_name |
+------------+-----------+
| Sophia | Feng |
+------------+-----------+
此方法依赖于已知姓名的分割字符,通常情况下为空格。LEFT() 函数返回字符串左侧指定个数的字符,而 RIGHT() 函数返回字符串右侧指定个数的字符。
SELECT
LEFT('Sophia Feng', LENGTH('Sophia Feng') - POSITION(' ' IN 'Sophia Feng')) AS first_name,
RIGHT('Sophia Feng', POSITION(' ' IN REVERSE('Sophia Feng')) - 1) AS last_name
输出:
+------------+-----------+
| first_name | last_name |
+------------+-----------+
| Sophia | Feng |
+------------+-----------+
SUBSTRING() 函数在实现上与 SUBSTRING_INDEX() 函数类似,只不过不考虑分隔符,而是基于长度截取字符串。此方法需要先找到名字在全名中的起始位置,代码如下:
SELECT
SUBSTRING('Sophia Feng', 1, LENGTH('Sophia Feng') - LENGTH(SUBSTRING_INDEX('Sophia Feng', ' ', -1))) AS first_name,
SUBSTRING('Sophia Feng', LENGTH(SUBSTRING_INDEX('Sophia Feng', ' ', -1)) + 2) AS last_name
输出:
+------------+-----------+
| first_name | last_name |
+------------+-----------+
| Sophia | Feng |
+------------+-----------+
无论采用哪种方法,都可以通过一些简单的函数和处理方式在 SQL 中拆分名字和姓氏。