0

私はしばらくの間、問題を解決しようとしていて、カーソルや while ループなどの方法を調べました。しかし、おそらくこれらは私の目的には必要ないと思います。私はMS SQL Studio 2012を使用しています。テーブルに、次のようなセミコロンで区切られた可変文字列データを持つ列があります(このデータが送信されました):

THIS IS ONE COLUMN:
245;345;2114;
3421;34;
31;

次のようなセミコロンに基づいて、データを列数に分割しようとしています。

FIRST COLUMN    |  SECOND COLUMN   | THIRD COLUMN   | etc
245                345                2114
3421               34
31

各行をセミコロンで区切ってテーブルにする関数があります。古いテーブルの "3421;34" 行で関数を呼び出すと、次のようになります。

ID  |  DATA
1      3421
2      34

私の質問は、この関数をメイン テーブルのすべての行に適用するにはどうすればよいかということです。while ループを使用する必要がありますか (これには永遠にかかる可能性があります!)。どうもありがとう。

4

1 に答える 1

0

手っ取り早いソリューションが必要な場合は、次の 2 つのSUBSTRING_INDEX関数を使用します。

SELECT
  SUBSTRING_INDEX(SUBSTRING_INDEX(col, ';', 1), ';', -1) col1,
  SUBSTRING_INDEX(SUBSTRING_INDEX(col, ';', 2), ';', -1) col2,
  SUBSTRING_INDEX(SUBSTRING_INDEX(col, ';', 3), ';', -1) col3,
  SUBSTRING_INDEX(SUBSTRING_INDEX(col, ';', 4), ';', -1) col4,
  SUBSTRING_INDEX(SUBSTRING_INDEX(col, ';', 5), ';', -1) col5
FROM
  yourtable

ここでフィドルを参照してください。すべての列が で終了するため、これが機能することに注意してください;。また、値が列に存在しない場合、NULL 列ではなく、EMPTY 列が取得されることに注意してください。

編集:既存のテーブルを更新する必要がある場合は、最初にいくつかの新しい列を追加する必要があります:

ALTER TABLE yourtable ADD COLUMN col1 VARCHAR(20);
ALTER TABLE yourtable ADD COLUMN col2 VARCHAR(20);
...

その後、UPDATE クエリを起動できます。

UPDATE yourtable
SET
  col1=SUBSTRING_INDEX(SUBSTRING_INDEX(col, ';', 1), ';', -1),
  col2=SUBSTRING_INDEX(SUBSTRING_INDEX(col, ';', 2), ';', -1),
  col3=SUBSTRING_INDEX(SUBSTRING_INDEX(col, ';', 3), ';', -1),
  col4=SUBSTRING_INDEX(SUBSTRING_INDEX(col, ';', 4), ';', -1),
  col5=SUBSTRING_INDEX(SUBSTRING_INDEX(col, ';', 5), ';', -1)

フィドルはこちらです。このクエリは 5 列に制限されています。必要に応じてさらに追加できます。

于 2013-07-02T22:13:22.507 に答える