在mysql查询中爆炸和内爆字符串

时间:2013-12-31 17:22:07

标签: mysql sql

+------+-----------------+
|  id  |      name       +
+------+-----------------+
|  1   | David Gilmour   |
|  2   | Roger Waters    |
|  3   | Li Jen Ho       |
+------+-----------------+

名称的当前格式为firstName lastName,我想将其更改为lastName firstName,我想在一个数据库查询中将其更改。

我想到的解决方案是按space分割名称,翻转项目,然后再用space胶水将它们重新打印。但我不知道如何为此编写查询。



我可以简单地在PHP中通过按空格爆炸名称并将它们放入数组中,反转数组然后通过空间胶水来破坏单词,但目前我无法访问PHP。

更新1:我找到了this similar question,但我无法让它发挥作用。我希望我不是问一个重复的问题。

更新2:名称可以包含2个以上的部分。我假设只有第一个单词是名字,其余名字是姓氏。

3 个答案:

答案 0 :(得分:1)

试试这个:

select concat(last_name," ",first_name) as FullName
from
(
select SUBSTRING_INDEX(SUBSTRING_INDEX(name, ' ', 2), ' ', -1) AS last_name, 
SUBSTRING_INDEX(SUBSTRING_INDEX(name, ' ', 1), ' ', -1) AS first_name
from your_table
) tab

查看此处的示例

http://sqlfiddle.com/#!2/cd4ee/4

修改

然后一个轻微的修改版本将完成您的工作。您可以根据需要推荐同一小提琴,以获取更新的样本。

select concat(last_name," ",first_name) as FullName
from
(
select right(name,(length(name) - instr(name,' '))) as last_name, 
SUBSTRING_INDEX(SUBSTRING_INDEX(name, ' ', 1), ' ', -1) AS first_name
from tab
) tab1

答案 1 :(得分:0)

这里使用3个部分名称:http://sqlfiddle.com/#!2/e2b03e/7

SELECT 
   SUBSTRING_INDEX(SUBSTRING_INDEX(name, ' ', 1), ' ', -1) AS first_name,
   If(  length(name) - length(replace(name, ' ', ''))>1,  
   SUBSTRING_INDEX(SUBSTRING_INDEX(name, ' ', 2), ' ', -1) ,NULL) 
           as middle_name,
   SUBSTRING_INDEX(SUBSTRING_INDEX(name, ' ', 3), ' ', -1) AS last_name
from tab

在评论中,你提到想要将中间名和姓氏放在一个字段中,但不要这样做。这只是继续不好的做法,你无疑会得到按中间名等排序的名字。

答案 2 :(得分:0)

我知道我迟到了,但有一个更好的解决方案可以处理未知数量的结果。

GROUP_CONCAT

SELECT student_name,
  GROUP_CONCAT(DISTINCT test_score
               ORDER BY test_score DESC SEPARATOR ' ')
FROM student
GROUP BY student_name;