SUBSTRING_INDEX(s, delimiter, number)
返回从字符串 s 的第 number 个出现的分隔符 delimiter 之后的子串。
如果 number 是正数,返回(从左边数)第 number 个 delimiter 左边的字符串 。
如果 number 是负数,返回(从右边数)第 number 的绝对值个 delimiter 右边的字符串。起始不含delimiter。
SELECT SUBSTRING_INDEX('a*b','*',1) -- a SELECT SUBSTRING_INDEX('a*b','*',-1) -- b SELECT SUBSTRING_INDEX(SUBSTRING_INDEX('a*b*c*d*e','*',3),'*',-1) -- c
举个栗子
有 person 表和 level 表分别如下:
id | name | desc |
1 | 大佬-A | |
2 | 巨佬-B | |
3 | C |
id | level | desc |
1 | 大佬 | dalao |
2 | 巨佬 |
第一题:查 person , 只含人名
select SUBSTRING_INDEX(`name`,'-',-1) from `person`;
第二题:把level表里 `大佬`的 desc 给到 person表里的大佬
update person a
left join `level` b
on SUBTRING_INDEX(a.`name`, '-', -1) = b.`level`
set a.`desc` = b.`desc`
where b.`level` = '大佬'
这种方案是人肉批量处理数据(此乃记录这篇博文的起因)的一种权宜之法, 一般用临时表。
项目中还是尽量的满足设计范式:所有属性都不能再分解。
最起码,不应该合并关键属性。