質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.49%
PostgreSQL

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

Q&A

解決済

2回答

5224閲覧

特定の文字列を抽出したい

mson

総合スコア11

PostgreSQL

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

0グッド

1クリップ

投稿2017/06/15 05:19

編集2017/06/15 06:19

特定の文字列を抽出したい

以下のように1行のレコードがあります。

AAA: aaa1,BBB: bbb1,BBB: bbb2,CCC: ccc1

※"KEY: val" のような文字列が複数項目あり、デリミタはカンマです。

抽出ルールは、 『KEYが "BBB" の、 val の値を抽出する』です。

理想の結果

bbb1,bbb2

補足

実際は複数レコードあり、項目数や並び順は決まっていません。
※1レコードに複数行あるのではなく、項目数や順序が様々なレコードが複数あります。

例)KEYとなる "BBB" の位置は先頭にある場合

BBB: bbb1,AAA: aaa1,BBB: bbb2,CCC: ccc1

出力結果

bbb1,bbb2

例)最終項目に1つだけある場合

AAA: aaa1,CCC: ccc1,BBB: bbb1

出力結果

bbb1

どのように SELECT したら良いか知恵を貸していただけませんか。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

A.Ichi

2017/06/15 05:53

複数行の場合はどのように表示するのでしょうか?
mson

2017/06/15 06:19

1レコードに複数行あるのではなく、項目数や順序が様々なレコードが複数あります。例)の出力結果を記載しました。
A.Ichi

2017/06/15 06:43

質問が良くなかったですね、BBBを含んでいる行を選択して表示する場合、1行で繋げて出すのか、複数行で出すのかをお聞きしたかったです。
mson

2017/06/15 07:02

複数レコードの結果は、各々のレコードで出力します。(1レコードとして集約しない)
guest

回答2

0

適当に調べながらやってみたらできましたが、普段PostgreSQLは使わないので、最適かどうかはわかりません。

SQL

1SELECT ARRAY_TO_STRING( 2 ARRAY( 3 SELECT SUBSTRING(COL FROM 6) FROM ( 4 SELECT regexp_split_to_table('AAA: aaa1,BBB: bbb1,BBB: bbb2,CCC: ccc1', ',') AS COL 5 ) A 6 WHERE COL LIKE 'BBB%' 7 ), ',' 8); 9

投稿2017/06/15 06:19

ttyp03

総合スコア16998

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

mson

2017/06/15 07:11

ありがとうございます。解決しました。PostgreSQL 9.1 のため、STRING_AGG を使用しようと思います。アイデアをありがとうございました。
guest

0

ベストアンサー

一行にまとめて出力します。

sql

1create temp table table_a (fld1 text); 2insert into table_a values 3('AAA: aaa1,BBB: bbb1,BBB: bbb2,CCC: ccc1'), 4('AAA: aaa1,CCC: ccc1,BBB: bbb1'), 5('CCC: ccc1,BBB: bbb1,AAA: aaa3'); 6 7select array_to_string( 8 array(select substr(f1,strpos(f1,': ')+2) f2 from ( 9 select regexp_split_to_table(fld1,',') f1 from table_a 10) t1 where f1 like 'BBB:%' 11),',') 12; 13

複数行で出力します

sql

1select 2( select array_to_string(array(select substr(f1,strpos(f1,': ')+2) 3 from (select unnest(string_to_array(fld1,',')) f1) t1 where f1 like 'BBB:%'),',') 4) 5from table_a where fld1 like '%BBB:%'; 6 7 array_to_string 8----------------- 9 bbb1,bbb2 10 bbb1 11(2 rows)

投稿2017/06/15 06:54

編集2017/06/15 09:13
A.Ichi

総合スコア4070

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

mson

2017/06/15 07:10

ありがとうございます。実現できました。最も早く回答いただいたため、ベストアンサーとさせていただきました。
ttyp03

2017/06/15 07:14

え…。回答した時間なら私の方が…。別にいいんですけどね、別に。
A.Ichi

2017/06/15 07:21

そうですよね。正しく表示されてます。
mson

2017/06/15 07:40

確かに、本当ですね。すみません、次の機会がありましたらまた宜しくお願い致します。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.49%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問