Mysqlはストアドプロシージャを通じて文字列を配列に分割します

Mysqlはストアドプロシージャを通じて文字列を配列に分割します

文字列を配列に分割するには、次の 3 つの MySQL 関数を使用する必要があります。

REVERSE(str) 文字の順序を逆にした文字列 str を返します。

SUBSTRING_INDEX(str,delim,count)

区切り文字 delim が count 番目に出現した後の文字列 str の部分文字列を返します。 count が正の場合、最後の区切り文字から左側にあるすべての文字を返します (左から数えて)。 count が負の場合、最後の区切り文字から右側にあるすべての文字を返します (右から数えて)。

REPLACE(str,from_str,to_str)

文字列 str 内のすべての出現箇所を文字列 to_str に置き換えた文字列 str を返します。

文字列を配列に分割する機能は、3 つの関数を組み合わせることで実現されます。

まず、2つの関数を記述します

1. 「特定の記号」で区切られたすべての文字列の数を取得します。関数の内容は次のとおりです。

(SQLコードをコピーしてNavicatで実行します)

区切り文字 $$
CREATE DEFINER=`root`@`%` FUNCTION `func_get_split_string_total`(
f_string varchar(1000)、f_delimiter varchar(5)
) 戻り値 int(11)
始める
 -- 指定された文字列の合計数を取得します。
 1+(length(f_string) - length(replace(f_string,f_delimiter,''))) を返します。
終わり$$
区切り文字 ;

2. 文字列をセグメンテーションで抽出する

(SQLコードをコピーしてNavicatで実行します)

区切り文字 $$
CREATE DEFINER=`root`@`%` FUNCTION `func_get_split_string`(
f_string varchar(1000),f_delimiter varchar(5),f_order int) 戻り値 varchar(255) CHARSET utf8
始める
 -- 指定された文字列の区切られた数を取得します。
 結果をvarchar(255)のデフォルトとして宣言します '';
 結果をreverse(substring_index(reverse(substring_index(f_string,f_delimiter,f_order)),f_delimiter,1));に設定します。
 結果を返します。
終わり$$
区切り文字 ;

次に、これら2つの関数を組み合わせて、分割する文字列と区切り文字を入力し、特定の記号で分割した後の配列を出力するストアドプロシージャを作成します。

(SQLコードをコピーしてNavicatで実行します)

区切り文字 $$
プロシージャ `sp_print_result` を作成します (
 IN f_string varchar(1000)、IN f_delimiter varchar(5)
)
始める
 -- 分離された文字列を取得します。
 cnt int のデフォルトを 0 と宣言します。
 i int をデフォルトで 0 と宣言します。
 cnt = func_get_split_string_total(f_string,f_delimiter) を設定します。
 存在する場合はテーブルを削除します tmp_print;
 一時テーブル tmp_print を作成します (num int not null);
 i < cnt の間
 する
  i = i + 1 と設定します。
  tmp_print(num) に値を挿入します (func_get_split_string(f_string,f_delimiter,i));
 終了しながら;
 tmp_print から * を選択します。
終わり$$
区切り文字 ;

次に、テストする文字列を入力します。

call sp_print_result(“434,123,12,234,123,123”,”,”);

結果は以下のとおりです

The user specified as a definer ('root'@'%') does not existが存在しません

解決策は次のとおりです。

実行: grant all privileges on *.* to root@"%" identified by ".";

実行: flush privileges;

これで問題は解決します。

最後に、ストアドプロシージャとMySQL関数についてお話しましょう。

ストアド プロシージャは、特定のテーブルまたは他のオブジェクトに対するタスクを伴うユーザー定義の SQL ステートメントのコレクションです。ユーザーはストアド プロシージャを呼び出すことができますが、関数は通常、データベースによって定義されるメソッドであり、パラメータを受け取って特定のタイプの値を返しますが、特定のユーザー テーブルは関与しません。

ストアド プロシージャと関数にはいくつかの違いがあります。

1) 一般的に、ストアド プロシージャによって実装される機能はより複雑ですが、関数によって実装される機能はより対象を絞っています。ストアド プロシージャは強力で、テーブルの変更を含む一連のデータベース操作を実行できます。一方、ユーザー定義関数を使用して、グローバル データベースの状態を変更する一連の操作を実行することはできません。

2) ストアド プロシージャはレコードセットなどのパラメータを返すことができますが、関数は値またはテーブル オブジェクトのみを返すことができます。関数は 1 つの変数のみを返すことができますが、ストアド プロシージャは複数の変数を返すことができます。ストアド プロシージャのパラメータには、IN、OUT、INOUT の 3 つのタイプがありますが、関数には IN タイプのみ使用できます。ストアド プロシージャは宣言時に戻り値の型は必要ありませんが、関数は宣言時に戻り値の型を記述する必要があり、関数本体には有効な RETURN ステートメントが含まれている必要があります。

3) ストアド プロシージャでは非決定論的関数を使用できますが、非決定論的関数をユーザー定義関数の本体に組み込むことはできません。

4) ストアド プロシージャは通常、独立した部分として実行されます (EXECUTE ステートメントによって実行されます)。一方、関数はクエリ ステートメントの一部として呼び出すことができます (SELECT 呼び出し)。関数はテーブル オブジェクトを返すことができるため、クエリ ステートメントの FROM キーワードの後に​​配置できます。ストアド プロシージャは SQL ステートメントでは使用できませんが、関数は使用できます。

要約する

以上がこの記事の全内容です。この記事の内容が皆様の勉強や仕事に何らかの参考学習価値をもたらすことを願います。123WORDPRESS.COM をご愛顧いただき、誠にありがとうございます。これについてもっと知りたい場合は、次のリンクをご覧ください。

以下もご興味があるかもしれません:
  • MySQL で SPLIT のような文字列分割関数を実装する
  • MySQLクエリフィールドで文字列分割関数を実装するためのサンプルコード

<<:  uniappを使用してWeChatミニプログラムでEChartsを使用する方法

>>:  CentOS サーバーのセキュリティ構成戦略

推薦する

Firefox で英語の文字が折り返されない問題の解決方法

テキストのレイアウトには、言語に応じていくつかの書式設定要件があります。たとえば、簡体字中国語では、...

MySQL 外部キー制約の例の説明

MySQL の外部キー制約は、2 つのテーブル間のリンクを確立するために使用されます。 1 つのテー...

Win7 で IIS7 Web および FTP サービスを完全にアンインストールする方法

昨日、パソコンにPHP開発環境をセットアップした後、Apacheサーバーを再起動するとエラーが続きま...

nginx.conf ファイルの構文強調表示とフォーマット設定には nginx.vim ツールを使用します。

私はtengineを使用しています。インストールディレクトリは/usr/local/tengineで...

MySQLにインデックスを追加しても効果がないいくつかの状況について簡単に説明します。

インデックスを追加すると、クエリの効率が向上します。インデックスを追加するということは、ドキュメント...

Ubuntu 20.04 オペレーティング システムの VMware インストール チュートリアル図

メモ: とにかく体験してみましょう。記録: NO.209この例の環境:仮想マシン: vmwareオペ...

Vueは単一ファイルコンポーネントの完全なプロセス記録を実装します

目次序文単一ファイルコンポーネント基本概念シンプルなローダーコンポーネントコンテンツの解析コンポーネ...

MySQL が大規模トランザクションを避けるべき理由とその解決方法

何が大問題ですか?長時間実行され、長時間コミットされないトランザクションは、大規模トランザクションと...

モバイルページで縦画面を強制する方法

最近、仕事でモバイルページを作成しました。もともと特別なことではありませんでしたが、非常に奇妙に感じ...

Reactのようなフレームワークをゼロから作成する

最近、インターネットで「Build your own React」という記事を見ました。著者は、シン...

vue3+TypeScript+vue-routerの使い方

目次使いやすいプロジェクトを作成するvue-cli 作成ヴィートクリエイションvue-routerを...

Sublime TextがUbuntuで中国語を入力できない問題の最も簡単な解決策

崇高なSublime Text はコード エディター (Sublime Text2 は有料ソフトウェ...

Mysql テーブルで利用可能な最小 ID 値を照会する方法

今日、研究室のプロジェクトを見ていたとき、私にとって「難しい」問題に遭遇しました。実は、それは私があ...

Web 開発の面接と筆記試験に必須の知識(必読)

HTML のインライン要素とブロックレベル要素の違い:標準的なドキュメント フローでは、ブロック ...

ネイティブ JS 音楽プレーヤー

この記事の例では、音楽プレーヤーを実装するためのJSの具体的なコードを参考までに共有しています。具体...