MySQL 文字列分割操作 (区切り文字を含む文字列のインターセプション)

MySQL 文字列分割操作 (区切り文字を含む文字列のインターセプション)

区切り文字なしの文字列抽出

質問の要件

データベース内のフィールド値:

実装効果: 1行のデータを複数行に変換する必要がある

実装されたSQL

SELECT LEFT(SUBSTRING('P1111',help_topic_id+1),1) AS num FROM mysql.help_topic WHERE help_topic_id < LENGTH('P1111');

関連する知識ポイント

1. 文字列インターセプション: SUBSTRING(str,pos)

1. パラメータの説明

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

2. 例

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

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

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

SUBSTRING_INDEX('7654,7698,7782,7788',',',-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')

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 テーブル:

実装手順:

ステップ 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 フィールド区切り文字 split_MySQL の SPLIT に似た関数で文字列を分割します

以下の関数は、文字列を配列のように処理する機能を実装します。

1. 一時テーブルを配列として使用する

関数 f_split(@c varchar(2000),@split varchar(2)) を作成します。
@t table(col varchar(20)) を返します。
として
始める
while(charindex(@split,@c)<>0)
始める
@t(col) 値を挿入します (substring(@c,1,charindex(@split,@c)-1))
@c = stuff(@c,@c),'') を設定します。
終わり
@t(col) 値を挿入 (@c)
戻る
終わり
行く
dbo.f_split('dfkd,dfdkdf,dfdkf,dffjk',',') から * を選択
関数 f_split を削除する
コル
--------------------
dfkd
dfdkdf
dfdkf
翻訳

(影響を受ける行数は4)

2. 指定された記号で文字列を分割する

分割後の要素の数を返します。この方法は非常に簡単です。文字列にセパレーターがいくつあるかを確認し、1 つ追加するだけで、必要な結果が得られます。

CREATE関数Get_StrArrayLength
(
@str varchar(1024),--分割する文字列 @split varchar(10) --区切り文字)
整数を返す
として
始める
@location int を宣言する
@start int を宣言する
@length int を宣言する
@str=ltrim(rtrim(@str)) を設定します。
@location=charindex(@split,@str) を設定します。
@長さを1に設定
@location<>0 の場合
始める
@start=@location+1 を設定します
@location=charindex(@split,@str,@start) を設定します。
@length=@length+1 を設定します
終わり
@長さを返す
終わり

呼び出し例:

dbo.Get_StrArrayLength('78,2,3',') を選択します。

戻り値: 4

3. 指定された記号で文字列を分割する

分割後の指定されたインデックスの要素を返します。配列として便利です。

CREATE関数Get_StrArrayStrOfIndex
(
@str varchar(1024),--分割する文字列 @split varchar(10),--区切り文字 @index int --取得する最初の要素)
varchar(1024)を返します
として
始める
@location int を宣言する
@start int を宣言する
@next int を宣言する
@seed int を宣言する
@str=ltrim(rtrim(@str)) を設定します。
@start=1 を設定
@next=1 を設定
@seed=len(@split) を設定します
@location=charindex(@split,@str) を設定します。
@location<>0 かつ @index>@next の場合
始める
@start=@location+@seed を設定します
@location=charindex(@split,@start) を設定します。
@next=@next+1 と設定
終わり
@location =0 の場合、@location =len(@str)+1 を選択します。
--ここでは 2 つの状況があります: 1. 文字列に区切り文字がありません。2. 文字列に区切り文字があります。while ループから抜け出すと、@location は 0 になります。これは、デフォルトで文字列の後に区切り文字があることを意味します。
部分文字列(@str,@start,@location-@start)を返す
終わり

呼び出し例:

dbo.Get_StrArrayStrOfIndex('8,9,4',2) を選択します。

戻り値: 9

4. 上記の2つの関数を組み合わせて、文字列内の要素を配列のように走査します。

@str varchar(50) を宣言する
@str='1,3,4,5' を設定します
@next int を宣言する
@next=1 を設定
@next<=dbo.Get_StrArrayLength(@str,') の場合
始める
dbo.Get_StrArrayStrOfIndex(@str,@next) を印刷します。
@next=@next+1 と設定
終わり

通話結果:

1

2

3

4

5

上記は私の個人的な経験です。参考になれば幸いです。また、123WORDPRESS.COM を応援していただければ幸いです。間違いや不備な点がありましたら、遠慮なくご指摘ください。

以下もご興味があるかもしれません:
  • MySQL 文字列分割の例 (区切り文字なしの文字列抽出)
  • 分割機能を実現するためのMySql文字列分割(フィールド分割と列転送)

<<:  小さな三角形の実装コードを含む CSS ナビゲーション バー メニュー

>>:  Vueコンポーネント化の基本的な使用方法の詳細

推薦する

MySql のスロークエリ分析とスロークエリログの開き方の詳細説明

最近はMySQLのパフォーマンス最適化についても研究しているので、今日の投稿は勉強ノートとしても使え...

Windows10のマウスを模倣して境界線を光らせる効果を実現するCSSの詳細解説

最新の Windows 10 アップデートをインストールした後、システム UI の詳細な効果が顕著に...

MySQL はどのようにしてマスターとスレーブの一貫性を確保するのでしょうか?

目次MySQLマスタースレーブの基本原理3つのbinlog形式の比較混合形式のバイナリログが存在する...

MySQL Community Server 圧縮パッケージのインストールと設定方法

今日は、MySQL をインストールしたかったので、公式 Web サイトにアクセスして、MySQL の...

伝説的な VUE 構文シュガーは何をするのでしょうか?

目次1. 糖衣構文とは何ですか? 2. VUE の構文糖とは何ですか? 1. 最も一般的な構文シュガ...

Linux でのファイルの編集、保存、終了の実践的な説明

Linux でファイルを編集した後、保存して終了するにはどうすればよいですか?保存して終了するコマン...

CSS でデジタル ページング効果のコードと手順を実装する方法

かなりの数のウェブサイトがデジタルページング効果を使用しています。たとえば、このサイトのページングも...

Linux Centos8 CA証明書作成チュートリアル

必要なファイルをインストールする Yum インストール openssl-* -yデータベースインデッ...

CSSはリストのスタイルを設定し、ナビゲーションメニューの実装コードを作成します。

1. リストシンボルを設定するlist-style-type: attribute; //リストの...

CSS でデフォルトのスタイルをクリアし、共通のスタイルを設定する方法

CSS デフォルトスタイルをクリア通常の明確なデフォルト スタイル: *{ マージン:0; パディン...

Vue を使用して Web ページのスクリーンショットを撮る方法をご存知ですか?

目次1. html2Canvasをインストールする2. 必要なVueコンポーネントを導入する3. ス...

Ubuntuで顔認識ログインを実装するための完全な手順

1. Howdyをインストール: howdyプロジェクトアドレス sudo add-apt-repo...

Robots.txtの詳細な紹介

robots.txt の基本的な紹介Robots.txt はプレーンテキスト ファイルであり、Web...

JavaScript を使用してテーブル情報を追加および削除する

JavaScript 入門JavaScript は軽量なインタープリタ型の Web 開発言語です。言...

JavaScriptイベント実行メカニズムの深い理解

目次序文ブラウザJS非同期実行の原理ブラウザのイベントループ実行スタックとタスクキューマクロタスクと...