Concat多列然后拆分它们 - MySQL

时间:2012-09-01 04:07:43

标签: mysql split concat

这是我需要的两个步骤。我有一个包含26列的表格,如下所示:

ColumnA   ColumnB   ColumnC  ColumnD  ColumnE  ColumnF

winter       0        0      summer   0        Dog

0          spring    fall      0      0        0

0            0        0      summer   car      0

我需要能够将列中的所有单词Concat分成一列,用|分隔但在其他栏目中遗漏任何零。第27行 winter | summer | dog 中的第一行应如下所示。然后,我需要能够将第27列冬季|夏季|狗的结果分为第28列冬季,第29列夏季,第20列狗

结果如下:

Column28    Column29    Column30

winter      summer      dog

spring      fall

summer      car

我正在使用的程序不允许我使用通配符,因此我需要取26列并将它们转储为3列,因为26行中任何一行中最多的一行是三个单词。我有750,000行,搜索正在进行中。

可能有一种更简单的方法可以将任何列中的第一个不是0的实例移动到第28列,第二个实例不是第38行连续的零,等等。我还有一堆其他列在我上面发布的26个专栏之前,你应该知道你应该注意的名字,电话等等,因为你不能连续说第27行连续零。

2 个答案:

答案 0 :(得分:1)

(我会将此作为答案而不是评论发布,因为我认为这非常重要)

唯一可持续的解决方案和今年你必须编写的其他27个讨厌的查询是一个更好的数据库设计。

您应该仔细阅读的概念称为“database normalization”,它会教您一种在一组规则和模式中对您的域进行建模的方法,这些规则和模式可让您灵活地存储(相对)像OP那样的设计陷阱(即只有10%有用数据的行,甚至更少的列,可用工具的根本弯曲使得任何有用的事情发生)。

这些概念看起来势不可挡(例如,the book that got me started是976页),但作为原则,它们可以非常简单地展示。为此,我把它留给维基百科作为一个不错的起点。

基本上,我们有一个“正常形式”系统,有点像数据库设计的“进度级别”。第一个(“第一范式”是命名法)单独会为你想要对这些数据做什么创造奇迹,并且基本上让你想到这个:我用这个表建模的单个原子事件是什么? /强>

我通常会在这里提供一个小例子,但维基百科是如此易于访问,我相信你会很快从first normal form的文章开始吸收它们。

然后,当然,您会对secondthird普通表单感兴趣。就市场趋势而言,这是收益递减的重点(即,对于更高的形式,几年内会回归)。但是,我会重申,如果你只是在你的建模领域中学到了如何实现第一个普通形式,那么你的生活会更好: - )

一旦你建立起来,你就会想要快速了解SQL的JOIN概念,因为这些规则基本上将你的域分解为原子块,并且你的许多任务将开始需要简单的连接查询。

祝你好运!

答案 1 :(得分:0)

SELECT *, SUBSTRING_INDEX(Column27, '|', 1) AS Column28,
          replace(substring(substring_index(Column27, '|', 2), length(substring_index(Column27, '|', 1)) + 1), '|', '') AS Column29,
          replace(substring(substring_index(Column27, '|', 3), length(substring_index(Column27, '|', 2)) + 1), '|', '') AS Column30
FROM (SELECT *, CONCAT_WS('|', NULLIF(ColumnA, 0), NULLIF(ColumnB, 0), ..., NULLIF(ColumnZ, 0)) AS Column27
      FROM MyTable)