0

这是我需要的一个真正的两步过程。我有一个有 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

我需要能够将列中的所有单词连接到一个由 | 分隔的列中 但在其他列中省略任何零。第 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 列,将行中非零的第二个实例移动到第 29 列,等等。我在 26 之前还有一堆其他列我在上面发布的列,例如姓名、电话等,您应该注意这些列,因为您不能只在第 27 列中连续说出第一个零。

4

2 回答 2

1

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

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

您应该作为起点仔细阅读的概念称为“数据库规范化”,它教您一种在一组规则和模式内对域建模的方法,这些规则和模式为您提供灵活的存储(相对),避免像您的 OP(即只有 10% 有用数据的行,甚至更少的列,可用工具的彻底弯曲以使任何有用的事情发生)。

这些概念可能看起来势不可挡(例如,让我入门的书有976 页),但作为原则,它们可以非常简单地演示。为此,我把它留给维基百科作为一个不错的起点。

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

我通常会在这里提供一个小例子,但维基百科是如此易于访问,我相信你会很容易地从他们关于第一范式的文章中开始吸收。

然后,当然,你会对第二范式和第三范式感兴趣。就市场趋势而言,这就是收益递减的点(即几年后回归更高的形式)。但是,我要重申,如果您只扎实地学会了如何在您的建模域中实现第一个范式,您的生活会好得多:-)

一旦确定了这一点,您将需要快速复习 SQL 的JOIN概念,因为这些规则本质上会将您的域分解为原子片段,并且您的许多任务将开始需要在查询中进行简单的连接。

祝你好运!

于 2012-09-01T04:36:07.910 回答
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)
于 2012-09-01T04:35:49.063 回答