特定のシンボルで複数の行と列に分割するMySQLの例

特定のシンボルで複数の行と列に分割するMySQLの例

一部の障害コード テーブルでは、履歴またはパフォーマンス上の理由から、次の設計パターンが使用されます。つまり、複数の属性値が同じ行または列に格納されます。次の表の tonnly_error_record に示すように:


この場合、列をセミコロン「;」で分割して複数の行を形成し、次にコンマ「,」で分割して複数の列を形成することを検討できます。次の表に示すように:

ここに画像の説明を挿入

これは、MySQL の文字列分割関数を使用して実現できます。関数の説明は次のとおりです。

SUBSTRING_INDEX(文字列、区切り文字、カウント)   
-- str: 分割する文字列; delim: 区切り文字; count: 区切り文字の出現回数

最後に、具体的な実装は次のようになります。

#ステップ 1: セミコロン「;」に基づいて複数の行に分割 #ステップ 2: カンマ「,"」に基づいて複数の列に分割 select distinct S1.tbox_vin,
                (substring_index(substring_index(S1.error_code, ',', 1), ',', -1)) を spn として選択します。
                (substring_index(substring_index(S1.error_code, ',', 2), ',', -1) を選択) fmi、
                S1.変更時間
から (
         t1.tbox_vinを選択し、
                substring_index(substring_index(t1.dm1_string, ';', t2.help_topic_id + 1), ';', -1) を error_code として、
                t1.変更時間
         tonnly_error_record t1 から
                  mysql.help_topic t2に参加する
                       t2.help_topic_id < (length(t1.dm1_string) - length(replace(t1.dm1_string, ';', '')) + 1) の場合
         t1.dm1_string が null ではない
           かつ t1.dm1_string != '') S1
s1.error_code != '' の場合
  s1.error_codeはnullではない
S1.modify_time desc で順序付けします。

関連する知識ポイント

1. 文字列の分割: SUBSTRING_INDEX (str, delim, count)

1. パラメータの説明

パラメータ名説明する
str分割する文字列
デリム区切り文字、文字で区切る
カウントcount が正の数の場合、n 番目の区切り文字の前のすべての文字が取得されます。count が負の数の場合、末尾から n 番目の区切り文字の後のすべての文字が取得されます。

2. 例

(1)区切り文字として2番目のカンマ「,」より前の文字をすべて取得します。

SUBSTRING_INDEX('7654,7698,7782,7788',',',2)

獲取第2個以“,”逗號為分隔符之前的所有字符

(2)最後から2番目のカンマ区切り文字「,」以降のすべての文字を取得します。

SUBSTRING_INDEX('7654,7698,7782,7788',',',-2) 

獲取倒數第2個以“,”逗號分隔符之后的所有字符

2. 置換関数: replace(str, from_str, to_str)

1. パラメータの説明

パラメータ名説明する
str置換する文字列
文字列から置換する文字列
文字列置換する文字列

2. 例

(1)区切り文字「,」カンマを「」スペースに置き換えます。

REPLACE('7654,7698,7782,7788',',','')

將分隔符“,”逗號替換為“”空

3. 文字列の長さを取得する: LENGTH( str )

1. パラメータの説明

パラメータ名説明する
str置換する文字列
文字列から置換する文字列
文字列置換する文字列

2. 例 (1) 文字列 '7654,7698,7782,7788' の長さを取得する

長さ('7654,7698,7782,7788') 

獲取 '7654,7698,7782,7788' 字符串的長度

SQL解析を実装

選択 
    SUBSTRING_INDEX(SUBSTRING_INDEX('7654,7698,7782,7788',',',help_topic_id+1),',',-1) AS num 
から 
    mysql.ヘルプトピック 
どこ 
    help_topic_id < LENGTH('7654,7698,7782,7788')-LENGTH(REPLACE('7654,7698,7782,7788',',',''))+1

ここでは、MySQL ライブラリの help_topic テーブルの help_topic_id を変数として使用していますが、これは help_topic_id が自動インクリメントされるためです。もちろん、他のテーブルの自動インクリメント フィールドも補助として使用できます。

help_topic テーブル:

help_topic 表

実装手順:

ステップ 1:まず、最終的に分割する必要がある文字列の数を取得し、help_topic_id を使用して n 番目の文字列のトラバースをシミュレートします。

関係するコード スニペット:

help_topic_id < LENGTH('7654,7698,7782,7788')-LENGTH(REPLACE('7654,7698,7782,7788',',',''))+1

實現過程

ステップ 2: SUBSTRING_INDEX (str, delim, count) 関数を使用して、コンマ "," に基づいて文字列を分割し、結果を num フィールドに割り当てます。

関係するコード スニペット:

SUBSTRING_INDEX(SUBSTRING_INDEX('7654,7698,7782,7788',',',help_topic_id+1),',',-1) AS num

最初のステップ:

区切り文字としてカンマ「,」を使用し、help_topic_id の値に従って n+1 番目の区切り文字の前のすべての文字列をインターセプトします。 (ここで n+1 なのは、help_topic_id が 0 から始まり、ここでは最初の区切り文字から取得する必要があるためです。)

SUBSTRING_INDEX('7654,7698,7782,7788',',',ヘルプトピックID+1)

例えば:
help_topic_id = 0 の場合、取得される文字列 = 7654
help_topic_id = 1 の場合、取得される文字列 = 7654,7698
…(等々)

ステップ2:

区切り文字としてカンマ「,」を使用し、最後の区切り文字の後にあるすべての文字列を抽出します。

SUBSTRING_INDEX(SUBSTRING_INDEX('7654,7698,7782,7788',',',help_topic_id+1),',',-1)

例えば:
最初のステップによると、help_topic_id = 0の場合、取得された文字列 = 7654、この時点で2番目のステップで傍受された文字列 = 7654
最初のステップによると、help_topic_id = 1の場合、取得された文字列 = 7654,7698、この時点で2番目のステップで傍受された文字列 = 7698
…(等々)

最終的に以下の効果を達成することに成功しました〜

這里寫圖片描述

注: 区切り文字なしの文字列分割については、MySQL - 文字列分割 (区切り文字なしの文字列インターセプト) を参照してください。

MySQL を特定のシンボルで複数の行と列に分割する例についてはこれで終わりです。MySQL 固有のシンボル分割の詳細については、123WORDPRESS.COM の以前の記事を検索するか、次の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • MySQL で単一のフィールド内の複数の値を分割および結合する方法
  • MySql インポート CSV ファイルまたはタブ区切りファイル
  • Mysqlはストアドプロシージャを通じて文字列を配列に分割します
  • MySQL で SPLIT のような文字列分割関数を実装する

<<:  src 属性と href 属性の違い

>>:  js のループメソッドとさまざまなトラバーサルメソッド

推薦する

Linux システムで jmeter を実行し、ローカル メモリを最適化する方法の詳細な説明

1. Linuxシステムにクロスシステムファイル転送ツールをインストールするルートユーザーのルートデ...

JavaScript キャンバスはマウスの動きに合わせてボールを動かすことを実装します

この記事の例では、マウスに従ってボールを動かすjsの具体的なコードを参考までに共有しています。具体的...

HBuilderX で Tomcat 外部サーバーを設定して、JSP インターフェイスを表示および編集する方法の詳細な説明

1. 最初の方法は、ローカルのTomcatを起動してJSPを表示することです。 tomcatのweb...

シェルスクリプトは、Docker の半自動コンパイル、パッケージ化、およびリリースアプリケーション操作を構築します。

Docker 公開方法は、DevOps (送信、コンパイル、パッケージ化、リリースなどの一連のイベ...

MySQL slow_log テーブルを InnoDB エンジンに変更することはできません。詳細な説明

背景mysql.slow_log からスロー クエリ ログを取得するのは遅く、テーブルは csv テ...

CSSファイルをインポートする3つの方法の詳細な説明

CSS を導入する方法には、インライン スタイル、内部スタイル シート、外部スタイル シートの 3 ...

Vueでaxiosを簡単にカプセル化する方法

Vueにaxiosを挿入する 'axios' から axios をインポートします。...

ウェブサイトのホームページを作成するための基本原則

1. ウェブサイトのホームページのハイパーテキスト ドキュメントの構成構造は、ユーザーの注意をできる...

Ubuntuのインストール Matlab2020b の詳細なチュートリアルとリソース

目次1. リソースファイル2. インストール2.1 詳細な手順2.1.1 ディスクイメージのマウント...

Tomcat の静的ページ (html) で中国語の文字化けが発生する問題の究極の解決策

tomcatでは、jspは文字化けしませんが、htmlの中国語は文字化けします理由はいくつかあります...

React Nativeでaxiosを使用してネットワークリクエストを行う方法

フロントエンド開発では、Ajax、jQuery ajax、axios、fetch など、データ要求を...

MySQL sql_mode の使用に関する詳細な説明

目次序文sql_mode の説明最も重要なオプションすべてのオプション要約する序文前回の記事「MyS...

Docker で Node プロジェクトをビルドしてデプロイする方法

目次DockerとはクライアントサイドDocker基本的なDocker操作画像名画像をプルするその他...

よく使われるnginxの書き換えルールの詳細な説明

この記事では、Web ページのリンクを美しくするためによく使用される書き換えルールをいくつか紹介しま...

MySQL でスロークエリログを有効にする方法

1.1 はじめにスロークエリログを有効にすると、MySQL は指定された時間を超えるクエリステートメ...