列表

详情


SQL154. 对过长的昵称截取处理

描述

现有用户信息表user_info(uid用户ID,nick_name昵称, achievement成就值, level等级, job职业方向, register_time注册时间):
id uid nick_name achievement level job register_time
1 1001
牛客1
19
0 算法
2020-01-01 10:00:00
2 1002
牛客2号
1200
3 算法
2020-01-01 10:00:00
3 1003
牛客3号♂ 22
0 算法
2020-01-01 10:00:00
4 1004
牛客4号
25
0 算法
2020-01-01 11:00:00
5 1005 牛客5678901234号
4000
7 算法 2020-01-11 10:00:00
6 1006
牛客67890123456789号
25
0 算法
2020-01-02 11:00:00

有的用户的昵称特别长,在一些展示场景会导致样式混乱,因此需要将特别长的昵称转换一下再输出,请输出字符数大于10的用户信息,对于字符数大于13的用户输出前10个字符然后加上三个点号:『...』。

由示例数据结果输出如下:
uid nick_name
1005 牛客5678901234号
1006
牛客67890123...

解释:字符数大于10的用户有1005和1006,长度分别为13、17;因此需要对1006的昵称截断输出。

示例1

输入:

drop table if exists user_info;
CREATE TABLE user_info (
    id int PRIMARY KEY AUTO_INCREMENT COMMENT '自增ID',
    uid int UNIQUE NOT NULL COMMENT '用户ID',
    `nick_name` varchar(64) COMMENT '昵称',
    achievement int COMMENT '成就值',
    level int COMMENT '用户等级',
    job varchar(32) COMMENT '职业方向',
    register_time datetime COMMENT '注册时间'
)CHARACTER SET utf8 COLLATE utf8_general_ci;

INSERT INTO user_info(uid,`nick_name`,achievement,`level`,job,register_time) VALUES
  (1001, '牛客1', 19, 0, '算法', '2020-01-01 10:00:00'),
  (1002, '牛客2号', 1200, 3, '算法', '2020-01-01 10:00:00'),
  (1003, '牛客3号♂', 22, 0, '算法', '2020-01-01 10:00:00'),
  (1004, '牛客4号', 25, 0, '算法', '2020-01-01 11:00:00'),
  (1005, '牛客5678901234号', 4000, 7, '算法', '2020-01-01 10:00:00'),
  (1006, '牛客67890123456789号', 25, 0, '算法', '2020-01-02 11:00:00');

输出:

1005|牛客5678901234号
1006|牛客67890123...

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

Mysql 解法, 执行用时: 36ms, 内存消耗: 6400KB, 提交时间: 2022-02-08

SELECT uid, IF(
   CHAR_LENGTH(nick_name) > 13, CONCAT(LEFT(nick_name, 10), "..."), nick_name
) nick_name
FROM user_info
WHERE CHAR_LENGTH(nick_name) > 10

Mysql 解法, 执行用时: 36ms, 内存消耗: 6424KB, 提交时间: 2021-12-14

select 
    uid,
    case when CHAR_LENGTH(nick_name) > 13 then concat(substr(nick_name,1,10),'...') 
         else nick_name end as nick_name
from user_info
where CHAR_LENGTH(nick_name) > 10

Mysql 解法, 执行用时: 36ms, 内存消耗: 6488KB, 提交时间: 2021-12-20

select uid, case when CHAR_LENGTH(nick_name)<=13 then nick_name
           else concat(substr(nick_name,1,10),'','...') end as nick_name
from user_info
where CHAR_LENGTH(nick_name)>10

Mysql 解法, 执行用时: 36ms, 内存消耗: 6500KB, 提交时间: 2021-11-30

select uid,
    case when CHARACTER_LENGTH(nick_name)>13 then concat(substring(nick_name,1,10),'...')
    else nick_name end nick_name
from user_info
where CHARACTER_LENGTH(nick_name)>10

Mysql 解法, 执行用时: 37ms, 内存消耗: 6372KB, 提交时间: 2021-12-01

select uid,
(case when char_length(nick_name)>13 then concat(substr(nick_name,1,10),'...')
else nick_name end) nick_name
from user_info
where char_length(nick_name)>10