• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:カンマをデリミタとするレコードを取得したい)

カンマをデリミタとするレコードを取得する方法

このQ&Aのポイント
  • MySQLのテーブルAにカラム2のカンマをデリミタとするレコードが入っています。これをカンマ区切りで分割し、各文字列の出現回数を求める方法を教えてください。
  • カンマで区切られた文字列の数に規則性がなく、どの文字列が含まれているかわかりません。また、文字列の数もわからないため、取得方法に困っています。
  • DBの構造は既に動作しているサービス内のものであり、変更することはできません。解決策をお教えいただけると幸いです。

質問者が選んだベストアンサー

  • ベストアンサー
  • pringlez
  • ベストアンサー率36% (598/1630)
回答No.1

そのようなケースなら、普通なら検索結果をプログラミング言語内で処理すると思いますよ。2重のループにすればいいだけなので大して難しくはないでしょう。私ならそうします。 SQLで取得は、不可能ではないかもしれませんが、できたとしても非常に複雑になるのでやめたほうがいいでしょう。

ss464146
質問者

お礼

ご回答ありがとうございます。 1回のSQLで取得することができたらPGのソースを9割再利用できるというメリットがあるため できるだけSQLにて1回でできたらと思っております。 もしどうしても不可能な場合はPG側にて処理をさせようと思います。 一応オラクルにて1回のSQLで取得することができました。 --元テーブル CREATE TABLE T_TEST_4 ( KEY VARCHAR2(8), NAME VARCHAR2(255) ) --元テーブルのデータ KEY NAME ------------------------------ 1 AA,AAA,BBB,BBBB,ZZZZZ 2 CCC,DDD,EE,FFFF --SQL /* SplitSQL */ select col1, col2 from( select col1, col2, row_number() over (partition by col1 order by col2 desc) rnk from( select substr( name, case rn when 1 then 1 else instr(name, delm, 1, rn - 1) + 1 end ,case rn when 1 then case instr(name, delm, 1, rn) when 0 then length(name) else instr(name, delm,1,rn)-1 end when nvl(length(translate(name, delm || name, delm)), 0) + 1 then length(name) else instr(name,delm,1,rn)-1-instr(name,delm,1,rn-1) end ) col1, key col2 from T_TEST_4, (select ',' delm from dual) b, (select rownum rn from all_catalog) c where rn <= nvl(length(translate(name,delm || name, delm)),0) + 1 ) ) where rnk = 1 order by col1; --SQL実行結果 COL1  COL2 ------------- AA 1 AAA 1 BBB 1 BBBB 1 CCC 2 DDD 2 EE 2 FFFF 2 ZZZZZ 1

関連するQ&A