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コンポーネント化の基本的な使用方法の詳細

推薦する

Ubuntu Linuxシステムをインストールするときにハードディスクをパーティション分割する最も合理的な方法の詳細な説明

Windows または Linux オペレーティング システムをインストールするかどうかに関係なく、...

フロントエンドページのポップアップマスクはページのスクロールを禁止します

フロントエンド開発者がよく遭遇する問題は、ユーザーに情報を提示するためのポップアップ ウィンドウを作...

Vueシングルページアプリケーションの事前レンダリング方法の例

目次序文vue-cli 2.0 バージョンvue-cli 3.0 バージョン要約する序文vue-cl...

Vueはスクロールバースタイルを実装します

最初はブラウザのスクロールバーのスタイルを変更して効果を実現したいと思っていましたが、情報を調べてみ...

Linuxは数字当てゲームのソースコードを実装する

シンプルな Linux 推測ゲームのソースコードゲームのルール:数字当てゲームは通常 2 人でプレイ...

Vue.jsはElement-uiを使用してナビゲーションメニューを実装します

この記事では、Element-uiを使用してvue.jsでナビゲーションメニューを実装するための具体...

MySQL 8.0.23 インストールの超詳細なチュートリアル

目次序文1. 公式サイトからMySQLをダウンロードする2. 解凍ファイルを設定する3. 初期化4....

MYSQL から MARIADB へのプロジェクト移行に関するチュートリアル

データベース (MySQL) を準備します。すでに MySQL をお持ちの場合は、これを無視できます...

エラー mysql テーブル 'performance_schema...解決方法

テスト環境は、JDBCドライバを使用してMariaDB 5.7でセットアップされています。 <...

SpringBoot と Docker の統合の詳細なプロセス

目次1. デモプロジェクト1.1 インターフェースの準備1.2 構成の準備2. Dockerがリモー...

MySQLはgroup_concat()関数に基づいて複数のデータ行を結合します

非常に便利な機能group_concat() について、マニュアルには次のように記載されています: ...

花火効果を実現するJavaScript(オブジェクト指向)

この記事では、花火効果を実現するためのJavaScriptの具体的なコードを参考までに紹介します。具...

MySQL外部キーの基本的な機能と使用方法の詳細な説明

この記事では、例を使用して、MySQL 外部キーの基本的な機能と使用方法を説明します。ご参考までに、...

mysql8.0.19 の基本データ型の詳細な説明

MySQL 基本データ型一般的な MySQL データ型の概要 ![1036857-201708011...

CentOS の環境変数と設定ファイルの詳細な説明

序文CentOS 環境変数設定ファイル システムは階層型システムであり、他のマルチユーザー アプリケ...