直接上需求java
1.地点表以下mysql
原数据库表是没有FIRST_LETTER这个字段的。sql
需求:在原表的基础上增长一列,要求该列是字段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
查出的结果以下编码
很明显如上的SQL能够知足需求code
接着来分析如上SQL字符串
第一步,对汉字进行编码,SQL以下io
SELECT CONVERT(location_name USING gbk) FROM t_location
运行结果以下class
第二步,取汉字(字符串)的第一个字,SQL以下
SELECT LEFT(CONVERT(location_name USING gbk),1) FROM t_location
运行结果以下
第三步,将第一个汉字转换成十六进制编码,SQL以下
SELECT HEX(LEFT(CONVERT(location_name USING gbk),1)) FROM t_location
运行结果以下
第四步,将十六进制转成十进制,SQL以下
SELECT CONV(HEX(LEFT(CONVERT(location_name USING gbk),1)),16,10) FROM t_location
运行结果以下
第五步,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()函数的用法,可是不明白用在这里是什么意思。
运行结果以下
第六步,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
运行结果以下
这一步中,mysql的函数elt()意思明白。
总结:此次转换流程第五步不明白,望高手见到了此帖子,指点一下!
补充:如上完成的是根据t_location表查询出该字段,可是该字段并不存在于t_location表中。以下操做是使该字段存在于t_location表中。
步骤1:很明显,给t_location表增长一个字段:first_letter。图以下
步骤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步添加了更新。