【问题标题】:SQL split comma separated row [duplicate]SQL拆分逗号分隔行[重复]
【发布时间】:2013-10-05 02:14:18
【问题描述】:

我有一列包含可变数量的逗号分隔值:

somethingA,somethingB,somethingC
somethingElseA, somethingElseB

我希望结果取每个值,并创建一行:

somethingA
somethingB
somethingC
somethingElseA
somethingElseB

如何在 SQL (MySQL) 中执行此操作?

(我试过用谷歌搜索“内爆”和“横向视图”,但这些似乎没有出现相关问题。所有相关的 SO 问题都试图做更复杂的事情)

【问题讨论】:

  • @MitchWheat - 这不是这个问题的答案。他们有一定数量的逗号分隔值,我没有。
  • 您是在寻找纯 SQL 解决方案,还是其他语言的解决方案 - 例如 PHP。
  • 在你的问题中是在哪里说的?
  • 如果您要将其标记为“关闭”,请实际链接到答案,而不是仅仅假设这是一个带有答案的常见问题。

标签: mysql sql hive


【解决方案1】:

你可以像这样使用纯 SQL 来做到这一点

SELECT SUBSTRING_INDEX(SUBSTRING_INDEX(t.values, ',', n.n), ',', -1) value
  FROM table1 t CROSS JOIN 
(
   SELECT a.N + b.N * 10 + 1 n
     FROM 
    (SELECT 0 AS N UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9) a
   ,(SELECT 0 AS N UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9) b
    ORDER BY n
) n
 WHERE n.n <= 1 + (LENGTH(t.values) - LENGTH(REPLACE(t.values, ',', '')))
 ORDER BY value

注意:诀窍是利用 tally(numbers) 表和在这种情况下非常方便的 MySQL 函数 SUBSTRING_INDEX()。如果您执行大量此类查询(拆分),那么您可能会考虑填充并使用持久化计数表,而不是像本例中那样使用子查询即时生成它。此示例中的子查询生成从 1 到 100 的数字序列,有效地允许您在源表中的每行拆分多达 100 个分隔值。如果您需要更多或更少,您可以轻松调整它。

输出:

|价值 | |----------------| |某事A | |某事B | |某事C | |别的东西A | |别的东西B |

这里是SQLFiddle演示


这是查询在持久化计数表中的外观

SELECT SUBSTRING_INDEX(SUBSTRING_INDEX(t.values, ',', n.n), ',', -1) value
  FROM table1 t CROSS JOIN tally n
 WHERE n.n <= 1 + (LENGTH(t.values) - LENGTH(REPLACE(t.values, ',', '')))
 ORDER BY value

这里是SQLFiddle演示

【讨论】:

  • 天才解决方案。谢谢。
  • 很好的答案,完美地将朋友 ID 插入用户关系表(基于包含friendid1,friendid2 的列)
  • 有效。提示:替换table1 -&gt; [your table]values -&gt; your field namevalue -&gt; your field name,不需要其他任何东西。
  • 伟大的解决方案就像魅力一样,但如何分组?
猜你喜欢
  • 2011-07-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-19
  • 2023-04-09
  • 2018-07-29
  • 2012-02-21
  • 1970-01-01
相关资源
最近更新 更多