MySQLでLTSVのストアドファンクションを作る 〜MySQLでLTSVのデータを扱う2 〜
毎度、ロジックを書くのは面倒ですので、
前回の内容をストアドファンクションにまとめます。
- ltsv形式から指定キーのvalueを取得
DELIMITER // CREATE FUNCTION get_ltsv(str varchar(65535),`key` varchar(255)) RETURNS varchar(65535) DETERMINISTIC BEGIN RETURN SUBSTRING_INDEX( SUBSTRING_INDEX( CONCAT("\t",str), CONCAT("\t",`key`,':'),-1), "\t",1 ); END; //
- ltsv形式で指定キーでvalueを変更
DELIMITER // CREATE FUNCTION put_ltsv(str varchar(65535),`key` varchar(255),val varchar(65535)) RETURNS varchar(255) DETERMINISTIC BEGIN RETURN -- 該当のキーが含まれているかどうかチェック IF(LOCATE(CONCAT("\t",`key`,':'),CONCAT("\t",str))>0, -- 置き換えの場合 CONCAT( SUBSTRING( SUBSTRING_INDEX( CONCAT("\t",str), CONCAT("\t",`key`,':'),1 ),2 ),"\t",`key`,':',val, SUBSTRING( str, LOCATE( "\t", str, LOCATE( CONCAT("\t",`key`,':'), CONCAT("\t",str) ) ) ) ), -- 追加の場合 CONCAT(str,"\t",`key`,':',val) ) ; END; //
SELECT put_ltsv('sample:8455\ttest:test:27::abctest:44\thogehoge:45','test','replace_str')
sample:8455 test:replace_str hogehoge:45
SELECT get_ltsv('test:test:27::abctest:44\tsample:8455\thogehoge:45','test')
test:27::abctest:44