备注:测试数据库版本为MySQL 8.0

Table of Contents

一.需求

将全名转换为大写首字母缩写,比如下面的名字:

Stewie Griffin

要求返回如下结果

S.G

二.解决方案

需要注意的就是SQL并不像C或Python语言那样灵活,所以,创建一个通用的解决方案来处理所有格式的姓名对于SQL来说不是一件容易的事情。在这里所介绍的解决方案假定名字都是由名和姓,或是由名、中间名(中间名缩写)及姓组成。

代码:

-- 2个

select case

when cnt = 2 then

trim(trailing '.' from

concat_ws('.',

substr(substring_index(name,' ',1),1,1),

substr(name,

length(substring_index(name,' ',1))+2,1),

substr(substring_index(name,' ',-1),1,1),

'.'))

else

trim(trailing '.' from

concat_ws('.',

substr(substring_index(name,' ',1),1,1),

substr(substring_index(name,' ',-1),1,1)

))

end as initials

from (

select name,length(name) - length(replace(name,' ','')) as cnt

from (

select replace('Stewie Griffin','.','') as name

) y

) x;

-- 3个

select case

when cnt = 2 then

trim(trailing '.' from

concat_ws('.',

substr(substring_index(name,' ',1),1,1),

substr(name,

length(substring_index(name,' ',1))+2,1),

substr(substring_index(name,' ',-1),1,1),

'.'))

else

trim(trailing '.' from

concat_ws('.',

substr(substring_index(name,' ',1),1,1),

substr(substring_index(name,' ',-1),1,1)

))

end as initials

from (

select name,length(name) - length(replace(name,' ','')) as cnt

from (

select replace('Stewie Griffin Boy','.','') as name

) y

) x;

测试记录

mysql> -- 2个

mysql> select case

-> when cnt = 2 then

-> trim(trailing '.' from

-> concat_ws('.',

-> substr(substring_index(name,' ',1),1,1),

-> substr(name,

-> length(substring_index(name,' ',1))+2,1),

-> substr(substring_index(name,' ',-1),1,1),

-> '.'))

-> else

-> trim(trailing '.' from

-> concat_ws('.',

-> substr(substring_index(name,' ',1),1,1),

-> substr(substring_index(name,' ',-1),1,1)

-> ))

-> end as initials

-> from (

-> select name,length(name) - length(replace(name,' ','')) as cnt

-> from (

-> select replace('Stewie Griffin','.','') as name

-> ) y

-> ) x;

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

| initials |

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

| S.G |

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

1 row in set (0.00 sec)

mysql>

mysql> -- 3个

mysql> select case

-> when cnt = 2 then

-> trim(trailing '.' from

-> concat_ws('.',

-> substr(substring_index(name,' ',1),1,1),

-> substr(name,

-> length(substring_index(name,' ',1))+2,1),

-> substr(substring_index(name,' ',-1),1,1),

-> '.'))

-> else

-> trim(trailing '.' from

-> concat_ws('.',

-> substr(substring_index(name,' ',1),1,1),

-> substr(substring_index(name,' ',-1),1,1)

-> ))

-> end as initials

-> from (

-> select name,length(name) - length(replace(name,' ','')) as cnt

-> from (

-> select replace('Stewie Griffin Boy','.','') as name

-> ) y

-> ) x;

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

| initials |

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

| S.G.B |

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

1 row in set (0.00 sec)

看到这一长串是不是很迷糊,我们把sql代码拆开来

-- 如果名称里面存在 '.' 替换为空

mysql> select replace('Stewie Griffin','.','') as name;

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

| name |

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

| Stewie Griffin |

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

1 row in set (0.00 sec)

-- 判断是 名和姓,或是由名、中间名(中间名缩写)及姓

mysql> select name,length(name) - length(replace(name,' ','')) as cnt

-> from (

-> select replace('Stewie Griffin','.','') as name

-> ) y;

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

| name | cnt |

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

| Stewie Griffin | 1 |

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

1 row in set (0.00 sec)

mysql> -- 通过substring截取' '第一次出现的地方,保留左边的

mysql> select substring_index('Stewie Griffin',' ',1) as n1;

+--------+

| n1 |

+--------+

| Stewie |

+--------+

1 row in set (0.00 sec)

mysql>

mysql> -- 截取第一个大写的字母

mysql> select substr('Stewie',1,1) as n2;

+------+

| n2 |

+------+

| S |

+------+

1 row in set (0.00 sec)

mysql>

mysql> -- 联合起来就是这样的

mysql> select substr(substring_index('Stewie Griffin',' ',1),1,1) as n1;

+------+

| n1 |

+------+

| S |

+------+

1 row in set (0.00 sec)

mysql>

mysql>

mysql>

mysql> -- 通过substring ' '最后一次出现的地方,保留右边的

mysql> select substring_index('Stewie Griffin',' ',-1) as n1;

+---------+

| n1 |

+---------+

| Griffin |

+---------+

1 row in set (0.00 sec)

mysql>

mysql> -- 截取第一个大写的字母

mysql> select substr('Griffin',1,1) as n2;

+------+

| n2 |

+------+

| G |

+------+

1 row in set (0.00 sec)

mysql>

mysql> -- 联合起来就是这样的

mysql> select substr(substring_index('Stewie Griffin',' ',-1),1,1) as n1;

+------+

| n1 |

+------+

| G |

+------+

1 row in set (0.00 sec)

mysql>

mysql>

-- trim 去掉最后面的'.'如存在

mysql> select trim(trailing '.' from 'S.G') as str;

+------+

| str |

+------+

| S.G |

+------+

1 row in set (0.00 sec)

mysql> select trim(trailing '.' from 'S.G.') as str;

+------+

| str |

+------+

| S.G |

+------+

1 row in set (0.00 sec)

mysql> select trim(trailing '.' from '.S.G.') as str;

+------+

| str |

+------+

| .S.G |

+------+

1 row in set (0.00 sec)

三.使用MySQL函数

代码:

-- 用函数进行封装

CREATE FUNCTION `f_get_name`(`pi_str` varchar(200)) RETURNS varchar(200) CHARSET utf8mb4

DETERMINISTIC

BEGIN

#Routine body goes here...

declare o_name varchar(200) default null;

declare l_cnt int default null;

declare o_name1 varchar(200) default null;

declare o_name2 varchar(200) default null;

declare o_name3 varchar(200) default null;

SELECT length(pi_str) - length(replace(pi_str,' ',''))

into l_cnt;

if l_cnt = 1 then

SELECT substr(substring_index(pi_str,' ',1),1,1)

into o_name1;

SELECT substr(substring_index(pi_str,' ',-1),1,1)

into o_name2;

SELECT concat(o_name1,'.',o_name2)

into o_name;

elseif l_cnt = 2 THEN

SELECT substr(substring_index(pi_str,' ',1),1,1)

into o_name1;

SELECT substr(pi_str,length(substring_index(pi_str,' ',1)) + 2,1)

into o_name2;

SELECT substr(substring_index(pi_str,' ',-1),1,1)

into o_name3;

SELECT concat(o_name1,'.',o_name2,'.',o_name3)

into o_name;

else

BEGIN

end;

end if;

RETURN o_name;

END

函数封装后,SQL代码真的简单太多

mysql> select f_get_name('Stewie Griffin') as name;

+------+

| name |

+------+

| S.G |

+------+

1 row in set, 1 warning (0.00 sec)

mysql> select f_get_name('Stewie Griffin Boy') as name;

+-------+

| name |

+-------+

| S.G.B |

+-------+

1 row in set (0.00 sec)

mySQL提取姓氏_MySQL 提取姓名大写首字母缩写相关推荐

  1. 姓名拼音首字母缩写_公司首字母缩写

    姓名拼音首字母缩写 首字母缩略词可以很容易地提醒您扩展主题的引用,并且显然可以以某种方式对其进行概括,这尤其有用,尤其是当您可以将它们用作新词来快速表达关系并直截了当地时(例如提及SLA,KPI,SO ...

  2. 姓名拼音首字母缩写_企业开发人员,首字母缩写词和歧视

    姓名拼音首字母缩写 在过去的几年中,我的客户从大多数中型市场公司和一些初创公司转变为几乎完全是初创公司,这种转变导致客户要求的语言范围更加广泛. 在我职业生涯的前10年中,我的业务约占Java的95% ...

  3. 姓名拼音首字母缩写_API代表什么? 英文首字母缩写词的定义。

    姓名拼音首字母缩写 Nope, API doesn't stand for Apple Pie Inside.

  4. Java 输入汉字姓名 输出 姓名拼音 首字母缩写组合

    这几天想做一个这样子的功能:在查询客户信息的时候,可以直接根据客户姓名的拼音缩写进行,例如,输入 HZ 就可以查询到姓名为 [黄镇]的客户. 在网上查询到的比较好的做法是在客户信息字段中加上一个拼音缩 ...

  5. mysql 获取姓名首字母_MySQL取姓名的首字母

    set @name='张三'; select @name, char_length(@name), case when char_length(@name)=1 then ELT( INTERVAL( ...

  6. Java-工具类:根据一段文字得到其大写首字母

    1.导入Maven依赖 <!-- https://mvnrepository.com/artifact/com.belerweb/pinyin4j --><dependency> ...

  7. c语言姓名提取首字母,SQL 提取姓名的首字母

    SQL 提取姓名的首字母,你想把姓名变成首字母的形式,考虑人名 Stewie Griffin,你希望得到 S.G.. SQL 提取姓名的首字母 问题描述 你想把姓名变成首字母的形式,考虑人名 Stew ...

  8. vue提取字符串中中文汉字的大写首字母

    vue提取字符串中中文汉字的大写首字母 1.需求背景 最近开发vue项目,在关于药品的项目中有个需求是要提取药品中文名称的首字母组成拼音码,例如:六味地黄丸提取首字母后是LWDHW. 解决方案 这里需 ...

  9. PinyinUtils 提取第一个汉子/单词的首字母

    import net.sourceforge.pinyin4j.PinyinHelper; /**  * 提取第一个汉子/单词的首字母  * @author Jacky  *  */ public c ...

最新文章

  1. 搭建nginx服务器及文件的配置
  2. 因贡献Linux社区被Linus关注,受公司10万期权奖励!酷派重回大众视野...
  3. [MYSQL] 如何彻底卸载MYSQL5.x
  4. C#开发人员应该知道的13件事情
  5. css不换行属性_前端 | css display:flex 的六个属性你知道吗
  6. THE QUESTIONS :The Top 25 (what we don't know?)
  7. Android 系统性能优化(41)---Android代码内存优化建议-OnTrimMemory优化
  8. 【转载】如何把Mysql5.5数据库的数据导入到MSSql 数据库中【mysql-connector-odbc-3.51.28-win32】...
  9. tp5 mysql 使用ignore_tp5数据库配置操作
  10. 无人驾驶到底怎么赚钱?很现实,八仙过海,各显神通
  11. Tomcat Caused by:java.lang.IllegalArgumentException: 指定的主资源集[……]无效
  12. C语言实现(小米面试题)给定一个句子(只包含字母,空格,逗号和句号), 将句子中的单词位置反转,符号不变。(使用指针)
  13. oracle 电子书大全
  14. Python开发Windows桌面应用程序(一)PyCharm+PyQt5开发环境搭建
  15. 2022物联网工程保研经历分享(中科院计算所、中科院软件所、中科大、南大、华中科技大学、北航、哈工大、中山大学等)
  16. 常见六大Web安全问题
  17. 为何上千名科技专家呼吁暂停大型AI研究?
  18. 【实战演练】快速获取容器VIPs,解决集群自动化测试难题
  19. Citrix 知识中心Top10 - 2012年9月 包括KB、白皮书、补丁、演讲以及工具。
  20. 图像拼接领域的经典文章以及常用的算法函数(一)(SIFT,APAP,AANAP,Seam-sutting,HomographyNet等等)

热门文章

  1. Spring Boot 对基础 Web 开发的支持(下)2-2
  2. pandas数据分析给力教程【完整版】(七)
  3. 消费者太穷不愿买手机?苹果的份额创新高,撕下国产手机遮羞布
  4. 光驱刻录软件提示需要计算机管理员权限,如何禁用光驱刻录功能、设置光驱只读而禁止刻录的方法...
  5. 欧美slots游戏 源码(完整)
  6. 基于ServiceStage的微服务开发与部署(二)
  7. 运营小白如何搭建【初期用户生命周期体系】
  8. JSON数据导出Excel表
  9. python画图横坐标_python画图把时间作为横坐标的方法
  10. Win7系统的电脑还可以装win10吗