0

これは本当に必要な 2 ステップのプロセスです。次のような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

列内のすべての単語を | で区切られた 1 つの列に連結できるようにする必要があります。ただし、他の列のゼロは除外します。最初の行は、列 27 winter|summer|dogで次のようになります。次に、列 27冬|夏|犬の結果を列 28 冬、列 29 夏、列 20 犬に分離できる必要があります。

結果は次のようになります。

Column28    Column29    Column30

winter      summer      dog

spring      fall

summer      car

私が使用しているプログラムではワイルドカードを使用できないため、26 列のいずれかで 1 つの行に含まれる単語のほとんどが 3 語であるため、26 列を取得して 3 にダンプする必要があります。750,000 行あり、検索に永遠に時間がかかります。

どの列にもゼロがない最初のインスタンスを列28に移動し、行にゼロがない2番目のインスタンスを列29に移動するだけの簡単な方法があるかもしれません.26の前に他の列もたくさんあります.上に投稿した名前、電話番号などの列は、27列目まで最初にゼロを続けて言うことはできないため、注意する必要があります.

4

2 に答える 2

1

(これは非常に重要だと思うので、コメントではなく回答として投稿します)

これと、今年作成しなければならない他の 27 の厄介なクエリに対する唯一の持続可能な解決策は、より優れたデータベース設計です。

出発点として熟読すべき概念は「データベースの正規化」と呼ばれ、一連のルールとパターン内でドメインをモデル化する方法を教えてくれます。 OP(つまり、有用なデータが10%しかない行、さらに少ない列、有用な何かを実現するために利用可能なツールを根本的に曲げる)。

概念は圧倒されるように思えるかもしれませんが (例えば、私が始めるきっかけとなった本は 976 ページあります)、原理としては、驚くほど簡単に示すことができます。そのためには、適切な出発点としてウィキペディアに任せます.

基本的に、データベース設計の「進捗レベル」のような「標準形」のシステムがあります。最初のもの (「最初の正規形」は命名法です) だけで、そのデータで何をしたいのかについて奇跡を起こすことができ、本質的に次のことを考えさせられます:このテーブルでモデル化している単一のアトミックなものは何ですか?

私は通常、ここで小さな例を提供しますが、ウィキペディアは非常にアクセスしやすいので、最初の正規形に関する記事からすぐに吸収し始めると確信しています。

次に、もちろん、第 2正規形と第 3正規形に興味があるでしょう。市場の傾向に関して言えば、これがリターンの減少点です (つまり、数年後にはより高いリターンを求めて戻ってきます)。ただし、モデル化されたドメインで最初の正規形を実装する方法をしっかりと学んだだけであれば、あなたの生活はずっと良くなることを繰り返します:-)

JOINこれらのルールは本質的にドメインをアトミックな断片に分割し、多くのタスクがクエリで単純な結合を必要とし始めるため、それが確立されたら、SQL の概念をすばやくブラッシュアップする必要があります。

幸運を!

于 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 に答える