1

"String"やなどの列を含むテーブルがあります。 で囲まれたすべての単語が別々の行になる"Another" simple "string"新しいテーブルを作成したいと思います。""

私はここのようにしようとしましたが、問題は「正しい」単語の量が行ごとに異なり、文字列内のすべての場所に配置される可能性があることです。

4

1 に答える 1

2

SQL を使用して文字列を分割するのは厄介です。一般に、SQL は各スカラー値を既約として扱います。SQL 式を使用して別のことをしようとすると、足で入力しているように感じます。

私はこれをSQLで解決しません。PHP、Perl、または Python でスクリプトを作成してデータベースからデータを取得し、スクリプト言語が提供する強力な文字列操作関数を使用して、結果をデータベースに挿入します。


あなたのコメントについて:

私が考えることができる唯一の純粋な MySQL ソリューションは、WHILE ループを含むストアド プロシージャを記述し、引用符で囲まれた単語を繰り返し引き出し、引用符で囲まれた単語がなくなるまで文字列を減らすことです。

つまり、このループ アプローチは次の疑似コードのようになります。

WHILE LOCATE('"', STRING) > 0
    SET WORD := SUBSTRING_INDEX(...)
    INSERT INTO OTHER_TABLE VALUES (WORD)
    SET STRING := REPLACE(STRING, '"WORD"', '')
END

これらの各操作は、MySQL 関数を使用して実行できます。

  • 文字列をテストして、引用符が含まれているかどうかを確認できます。

    mysql> select locate('"', 'the "quoted" word');
    +-------------------------------------+
    | locate('"', 'the "quoted" word', 1) |
    +-------------------------------------+
    |                                   5 |
    +-------------------------------------+
    
  • 文字列から最初に引用された単語を見つけることができます:

    mysql> select substring_index(substring_index('the "quoted" word', '"', 2), '"', -1);
    +------------------------------------------------------------------------+
    | substring_index(substring_index('the "quoted" word', '"', 2), '"', -1) |
    +------------------------------------------------------------------------+
    | quoted                                                                 |
    +------------------------------------------------------------------------+
    
  • 文字列から引用符で囲まれた単語を削除できます。

    mysql> select replace('the "quoted" word', concat('"', 'quoted', '"'), '');
    +--------------------------------------------------------------+
    | replace('the "quoted" word', concat('"', 'quoted', '"'), '') |
    +--------------------------------------------------------------+
    | the  word                                                    |
    +--------------------------------------------------------------+
    

最終的な手順のコーディングはお任せします。

于 2013-10-16T19:59:04.263 に答える