Mysqlは、文字列を複数行のデータに分割する文字列分割機能を実装しています。

Javaでは、Stringオブジェクトのsplitメソッドを使用して、指定した文字で文字列を文字列配列に分割できますが、MySQLは文字列分割関数を提供していません。今日、私たちはこのニーズに遭遇し、解決策を見つけました。みんなと共有する

シナリオ:組織化されたテーブル(ツリー構造を持つ種類)には、現在の部門のすべての親部門のIDを記録するツリーパスのフィールドがあります。たとえば、1-10-13は、組織の親組織が13、13の親組織は10で、10の親組織は1です。現在のユーザーの組織構造を照会します。たとえば、運輸省のローカルマシン(財務部門)の財務担当者は、ツリーパスを分割し、でクエリを実行する必要があります。

解決策1

1ストアドプロシージャを作成します

CREATE FUNCTION split(
  x VARCHAR(255),
  delim VARCHAR(12),
  pos INT
)
RETURNS VARCHAR(255)
RETURN REPLACE(SUBSTRING(SUBSTRING_INDEX(x, delim, pos),
       LENGTH(SUBSTRING_INDEX(x, delim, pos -1)) + 1),
       delim, '');

関数分析:3つのパラメーターを渡します。最初のパラメーターは分割される文字、2番目のパラメーターは除算、3番目のパラメーターは分割された領域の数です。


2プロセスを呼び出してクエリを実行します

select split('1,2,3,4,5',',',help_topic_id)
from mysql.help_topic 
where help_topic_id between 1 and  length('1,2,3,4,5') -length(replace('1,2,3,4,5',',',''));

分析:これはmysqlに付属するテーブルmysql.help_topicです。そのhelp_topic_idは0から643まで連続しており、文字列が分割された後にhelp_topic_idの数を制御するだけで済みます。



解決策2

SELECT 
SUBSTRING_INDEX(SUBSTRING_INDEX('7654,7698,7782,7788',',',help_topic_id+1),',',-1) AS num 
FROM 
mysql.help_topic 
WHERE 
help_topic_id < LENGTH('7654,7698,7782,7788')-LENGTH(REPLACE('7654,7698,7782,7788',',',''))+1

参照:https://www.cnblogs.com/gered/p/10797012.html

おすすめ

転載: blog.csdn.net/dndndnnffj/article/details/111318780