【问题标题】:Reverse words in string via MySQL functions通过 MySQL 函数反转字符串中的单词
【发布时间】:2018-01-08 06:53:40
【问题描述】:

我正在通过 WordPress 使用 MySQL,我想根据它的单词以相反的顺序对标题进行排序。例如:

Samuel Leroy Jackson -> Jackson Leroy Samuel
Samuel L Jackson     -> Jackson L Samuel
Samuel Jackson       -> Jackson Samuel
Samuel L Jackson Jr  -> Jr Jackson L Samuel

我想通过 MySQL 执行此操作,以便可以根据结果进行排序。

【问题讨论】:

  • 您应该考虑将数据分成两列:名字和姓氏。
  • 在 mysql 中执行此操作并不是一个好主意。 RDBMS 在文本处理中的效率并不高。您最好创建一个附加字段并使用程序更改单词的顺序并将结果保存在新字段中。
  • 转储到电子表格并拆分名称并更新回mysql。如果这是一次性的。
  • 你应该阅读this
  • @HoneyBadger 100% 同意。但是,我正在使用现有的项目和数据集。不幸的是,歧义可能仍然存在。

标签: mysql sql wordpress


【解决方案1】:

以下示例将反转 3 个单词的字符串。您可以使用此示例并为 2 和 4 个单词的字符串编写类似的反向器(以防您的数据限制为 2-4 个单词)。 然后,您可以只运行 3 个不同的查询,一个查询每个单词数量(或者将它们全部与联合)来处理所有数量的单词。

作为示例,运行此命令将输入​​ Jackson Leroy Samuel 反转为输出 Samuel Leroy Jackson

SELECT 
    CONCAT(SUBSTRING_INDEX('Jackson Leroy Samuel', ' ', - 1),
            ' ',
            SUBSTR('Jackson Leroy Samuel',
                INSTR('Jackson Leroy Samuel', ' ') + 1,
                INSTR('Jackson Leroy Samuel', ' ')),
            LEFT('Jackson Leroy Samuel',
                LOCATE(' ', 'Jackson Leroy Samuel') - 1));

【讨论】:

    【解决方案2】:

    并不是说 SQL 数据库在文本处理方面效率低下,而是由于 SQL 倾向于将列视为原子值,因此对子字符串和值的其他部分进行操作的操作并不是很 方便。

    例如,在 MySQL 中,尝试将字符串拆分为数组有点尴尬。真的没有数组数据类型。

    最接近的是SUBSTRING_INDEX()。您可以根据字符分隔符获取子字符串。在这种情况下,请使用空格作为分隔符。

    mysql> SET @name = 'Samuel Leroy Jackson';
    mysql> SELECT SUBSTRING_INDEX(@name, ' ', -1) AS `last name`,
        ->        SUBSTRING_INDEX(@name, ' ', 1) AS `first name`,
        ->        SUBSTRING_INDEX(SUBSTRING_INDEX(@name, ' ', 2), ' ', -1) AS `middle name`;
    +-----------+------------+-------------+
    | last name | first name | middle name |
    +-----------+------------+-------------+
    | Jackson   | Samuel     | Leroy       |
    +-----------+------------+-------------+
    

    当您有可选的“Jr.”时,您必须弄清楚如何处理案件。或其他三个以上单词的名称。我建议您阅读我为 SUBSTRING_INDEX() 链接的文档,并花时间阅读同一页面上的其他字符串函数。

    【讨论】:

    • Downvoter:请解释为什么您认为这个答案不好。也许我可以改进它。
    猜你喜欢
    • 2020-03-10
    • 2015-12-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-05
    • 2010-11-03
    • 2011-11-07
    相关资源
    最近更新 更多