【问题标题】:Explode and implode strings in mysql query在 mysql 查询中分解和内爆字符串
【发布时间】:2014-01-18 14:29:10
【问题描述】:
+------+-----------------+
|  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 个以上的部分。我假设只有第一个单词是名字,其余的名字是姓氏。

【问题讨论】:

  • 那么您可以访问什么? awk 会在一秒钟内完成此操作,Word 也可以通过查找替换来完成此操作,Excel 公式可以提供帮助...否则,如果您要将名称存储在数据库中并且这些部分具有含义(例如“姓氏”和“名字”),你真的应该保留两列以避免这样的问题。
  • 我认为他根本不会使用 Microsoft Office 套件。标签专门说“mysql”。他还谈到了使用 PHP,这表明他正在编写服务器端 Web 脚本。
  • @lc。我正在使用的服务器只有mysql,我无法在上面安装php!为“名字”和“姓氏”创建 2 列是个好主意,但拆分名字仍然有问题。
  • 你能安装像github.com/mysqludf/lib_mysqludf_preg#readme这样的mysql库吗?
  • @DigitalChris 我不确定。我想我会找到一个简单快速的 SQL 查询来解决我的问题。

标签: mysql sql


【解决方案1】:

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

GROUP_CONCAT

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

【讨论】:

    【解决方案2】:

    试试这个:

    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
    

    【讨论】:

    • 您的解决方案看起来很有希望,但我对我的问题进行了更新。名称可以有两个以上的部分,我想将第一部分保留为名字,将字符串的其余部分保留为姓氏。
    • 虽然这适用于他指定的所有标准,但如果 OP 希望它能够正确扩展,他们应该考虑使索引更加动态以支持中间名等。考虑使用 @987654325 @ 作为确定全名中有多少“单词”的一种方法,然后相应地处理结果。
    • 我在您的示例中添加了另一行,您可以看到它运行不正常。 sqlfiddle.com/#!2/e2b03e/1
    • @faridv,暂时离开办公桌。查看我的编辑,无论名称中有多少部分,它现在都可以使用。
    • 您的第二个查询似乎有效,我需要试一试。
    【解决方案3】:

    这里使用 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
    

    您在评论中提到希望将中间名和姓氏放在一个字段中,但不要这样做。这只是继续糟糕的做法,毫无疑问,您最终会得到按中间名等排序的名称。

    【讨论】:

    • 首先感谢您的回答。其次,您的答案与我在问题中提到的对我不起作用的答案相同。三分之一的名称甚至可以超过 3 个部分。我需要一个涵盖任何给定名称的解决方案。
    • 感谢 @Rahul 的 sqlfiddle 设置。
    • 我的名字是波斯语,他们没有中间名。他们有名字和多部分姓氏。
    • 好的,使用上面的代码并将first_name插入一个字段并将“Middle_name Last_name”插入另一个字段仍然没有问题......或者将其全部更新回一个名称字段,但不要这样做如果你能避免的话。
    猜你喜欢
    • 2012-07-20
    • 1970-01-01
    • 1970-01-01
    • 2020-02-23
    • 2017-03-03
    • 1970-01-01
    • 2011-05-21
    • 2014-02-22
    • 2016-03-05
    相关资源
    最近更新 更多