这是我需要的两个步骤。我有一个包含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行连续零。
答案 0 :(得分:1)
(我会将此作为答案而不是评论发布,因为我认为这非常重要)
唯一可持续的解决方案和今年你必须编写的其他27个讨厌的查询是一个更好的数据库设计。
您应该仔细阅读的概念称为“database normalization”,它会教您一种在一组规则和模式中对您的域进行建模的方法,这些规则和模式可让您灵活地存储(相对)像OP那样的设计陷阱(即只有10%有用数据的行,甚至更少的列,可用工具的根本弯曲使得任何有用的事情发生)。
这些概念看起来势不可挡(例如,the book that got me started是976页),但作为原则,它们可以非常简单地展示。为此,我把它留给维基百科作为一个不错的起点。
基本上,我们有一个“正常形式”系统,有点像数据库设计的“进度级别”。第一个(“第一范式”是命名法)单独会为你想要对这些数据做什么创造奇迹,并且基本上让你想到这个:我用这个表建模的单个原子事件是什么? /强>
我通常会在这里提供一个小例子,但维基百科是如此易于访问,我相信你会很快从first normal form的文章开始吸收它们。
然后,当然,您会对second和third普通表单感兴趣。就市场趋势而言,这是收益递减的重点(即,对于更高的形式,几年内会回归)。但是,我会重申,如果你只是在你的建模领域中学到了如何实现第一个普通形式,那么你的生活会更好: - )
一旦你建立起来,你就会想要快速了解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)