mysql --中文转汉语拼音,取首字母

直接上需求

1.地点表如下

164035_NNyl_2312022.jpg

原数据库表是没有FIRST_LETTER这个字段的。

需求:在原表的基础上增加一列,要求该列是字段LOCATION_NAME拼音的首字母。

直接上SQL

Select location_id,location_name ,
ELT(INTERVAL(CONV(HEX(left(CONVERT(location_name USING gbk),1)),16,10),
0xB0A1,0xB0C5,0xB2C1,0xB4EE,0xB6EA,0xB7A2,0xB8C1,0xB9FE,0xBBF7,
0xBFA6,0xC0AC,0xC2E8,0xC4C3,0xC5B6,0xC5BE,0xC6DA,0xC8BB,0xC8F6,
0xCBFA,0xCDDA,0xCEF4,0xD1B9,0xD4D1),
'A','B','C','D','E','F','G','H','J','K','L','M','N','O','P',
'Q','R','S','T','W','X','Y','Z') as FIRST_LETTER 
FROM t_location

查出的结果如下

164449_H40l_2312022.jpg

很明显如上的SQL可以满足需求

接着来分析如上SQL

第一步,对汉字进行编码,SQL如下

SELECT CONVERT(location_name USING gbk) FROM t_location

运行结果如下

164748_aOC6_2312022.jpg

第二步,取汉字(字符串)的第一个字,SQL如下

SELECT LEFT(CONVERT(location_name USING gbk),1) FROM t_location

运行结果如下

165056_LkGf_2312022.jpg

第三步,将第一个汉字转换成十六进制编码,SQL如下

SELECT HEX(LEFT(CONVERT(location_name USING gbk),1)) FROM t_location

运行结果如下

165449_c5z8_2312022.jpg

第四步,将十六进制转成十进制,SQL如下

SELECT CONV(HEX(LEFT(CONVERT(location_name USING gbk),1)),16,10) FROM t_location

运行结果如下

170243_dXz2_2312022.jpg

第五步,SQL如下,

SELECT INTERVAL(CONV(HEX(LEFT(CONVERT(location_name USING gbk),1)),16,10),0xB0A1,0xB0C5,0xB2C1,0xB4EE,0xB6EA,0xB7A2,0xB8C1,0xB9FE,0xBBF7,
0xBFA6,0xC0AC,0xC2E8,0xC4C3,0xC5B6,0xC5BE,0xC6DA,0xC8BB,0xC8F6,
0xCBFA,0xCDDA,0xCEF4,0xD1B9,0xD4D1) FROM t_location

不知道如下这些数字有什么用

0xB0A1,0xB0C5,0xB2C1,0xB4EE,0xB6EA,0xB7A2,0xB8C1,0xB9FE,0xBBF7,0xBFA6,0xC0AC,0xC2E8,0xC4C3,0xC5B6,0xC5BE,0xC6DA,0xC8BB,0xC8F6,
0xCBFA,0xCDDA,0xCEF4,0xD1B9,0xD4D1

懂mysql中interval()函数的用法,但是不明白用在这里是什么意思。

运行结果如下

174718_t0KK_2312022.jpg

第六步,SQL如下

SELECT location_id,location_name,ELT(INTERVAL(CONV(HEX(LEFT(CONVERT(location_name USING gbk),1)),16,10),0xB0A1,
0xB0C5,0xB2C1,0xB4EE,0xB6EA,0xB7A2,0xB8C1,0xB9FE,0xBBF7,0xBFA6,0xC0AC,0xC2E8,0xC4C3,0xC5B6,0xC5BE,0xC6DA,0xC8BB,
0xC8F6,0xCBFA,0xCDDA,0xCEF4,0xD1B9,0xD4D1),
'A','B','C','D','E','F','G','H','J','K','L','M','N','O','P','Q','R','S','T','W','X','Y','Z')  FROM t_location

运行结果如下

180207_yeU3_2312022.jpg

这一步中,mysql的函数elt()意思明白。

总结:这次转换流程第五步不明白,望高手见到了此帖子,指点一下!

补充:如上完成的是根据t_location表查询出该字段,但是该字段并不存在于t_location表中。如下操作是使该字段存在于t_location表中。

步骤1:很明显,给t_location表增加一个字段:first_letter。图如下

093026_oR8Z_2312022.jpg


步骤2:写SQL

UPDATE t_location 
INNER JOIN(
Select location_id,location_name ,
ELT(INTERVAL(CONV(HEX(left(CONVERT(location_name USING gbk),1)),16,10),
0xB0A1,0xB0C5,0xB2C1,0xB4EE,0xB6EA,0xB7A2,0xB8C1,0xB9FE,0xBBF7,
0xBFA6,0xC0AC,0xC2E8,0xC4C3,0xC5B6,0xC5BE,0xC6DA,0xC8BB,0xC8F6,
0xCBFA,0xCDDA,0xCEF4,0xD1B9,0xD4D1),
'A','B','C','D','E','F','G','H','J','K','L','M','N','O','P',
'Q','R','S','T','W','X','Y','Z') as firstLetter 
FROM t_location) tl
ON tl.location_id = t_location.location_id
set t_location.first_letter = tl.firstLetter

该SQL实际上是在上述第一个模块中的第5步添加了更新。



转载于:https://my.oschina.net/u/2312022/blog/626762

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值