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