🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Presto

Prestoは、Facebook社がオープンソースで公開した分散処理基盤。Hive/Impalaと同じ分散SQLエンジンの一つです。それぞれのタスクが同時進行できる計算モデルを使用。中間データをメモリに持つため、タスク間のデータのやりとりが高速であることが特徴です。

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

解決済

4回答

4061閲覧

SQLで同じカラムに入っている文字列から特定の箇所を抽出する

9nom

総合スコア42

Presto

Prestoは、Facebook社がオープンソースで公開した分散処理基盤。Hive/Impalaと同じ分散SQLエンジンの一つです。それぞれのタスクが同時進行できる計算モデルを使用。中間データをメモリに持つため、タスク間のデータのやりとりが高速であることが特徴です。

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グッド

0クリップ

投稿2018/11/06 08:58

以下のようなテーブルがあり、

idjob
1【資格1】月給100,000円【資格2】月給105,000円+賞与 基本給2ヶ月分【資格3】月給120,000円+賞与 基本給2ヶ月分 手当…6,000円/月

このテーブルから、資格2の月給はいくらか、賞与はいくらかの情報のみを抜き出したいです。
可能でしょうか。よろしくお願いいたします。

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

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

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

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

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

sazi

2018/11/06 09:06

「賞与はいくらか」というのは例でいうと「基本給2ヶ月分」とかですか?また、パターンとしては「賞与」の文字に続く以外に法則はあるのでしょうか
9nom

2018/11/06 09:35

パターンとしては、「賞与」の文字に続くものしかありません。その他の文字もパターンはこれのみとなっています。
sazi

2018/11/06 09:46

【資格2】と【資格3】に挟まれているもの、という抽出条件は要件を満たしますか?
9nom

2018/11/06 09:52

満たします。(応用すれば資格1と資格2の間に挟まれているもの、も抽出できるので)
guest

回答4

0

ベストアンサー

こんにちは!
saziさんのおっしゃる通り、正規表現(パターンマッチ)が使えます。

SQL

1select 2 job, 3 substring(job,'【資格2】月給([\d,]+)円') as 基本給, 4 substring(job,'【資格2】月給[\d,]+円+賞与 基本給(\dヶ月分)') as 賞与 5 from table
job基本給賞与
【資格1】月給100,000円【資格2】月給105,000円+賞与 基本給2ヶ月分【資格3】月給120,000円+賞与 基本給2ヶ月分 手当…6,000円/月105,0002ヶ月分

posglesqlのバージョンは9.3で確認しました。

投稿2018/11/07 01:07

編集2018/11/07 02:32
mikupedia

総合スコア159

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

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

yambejp

2018/11/07 02:25

「.*」っていります?
mikupedia

2018/11/07 02:33

ご指摘ありがとうございます。 不要なので削除しました。
guest

0

色々取り出し方は考えられます。(文字列関数と演算子
「【資格2】と【資格3】に挟まれているもの」で抽出

SQL

1select 2 replace(replace(substring(job from search1 || '.+?' || search2), search1, ''), search2, '') -- 正規表現 3, substring(job, position(search1 in job)+length(search1), position(search2 in job)-position(search1 in job)-length(search2)) 4, split_part(split_part(job, search2, 1), search1, 2) 5from (values( 6 '【資格2】' 7 ,'【資格3】' 8 ,'【資格1】月給100,000円【資格2】月給105,000円+賞与 基本給2ヶ月分【資格3】月給120,000円+賞与 基本給2ヶ月分 手当…6,000円/月' 9 )) as test(search1,search2,job)

正規表現では直接抜き出しも表現で可能だと思いますが、得意ではないので。。。

投稿2018/11/06 12:37

編集2018/11/07 01:30
sazi

総合スコア25327

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

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

0

賞与、ボーナス、複数の言い方がありそうな?

使い物になるシステムを作りたいなら、データベースの正規化 をきちんと理解した上でテーブルを設計しては?

投稿2018/11/06 09:18

Orlofsky

総合スコア16417

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

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

9nom

2018/11/06 09:36

文言の言い回しのパターンは現行のもののみとします。
9nom

2018/11/06 09:37

テーブルがどうなっているかはこの問題(すでにこの状態になってしまっているものを名寄せするタスク)には関係ないことです。
guest

0

これってSQLのやることではないのでは?
もしやるならそれなりのテーブルを組んでおく必要があると思います

参考

今回はpostgreのご質問のようですがmysqlだとjson型のカラムを設定できますので
同じような処理がpostgreにもあるかもしれません。

SQL

1/* あくまでmysql */ 2create table tbl (id int,job json); 3insert into tbl values(1,'{"資格1":{"月給":"100,000円"},"資格2":{"月給":"105,000円","賞与":"基本給2ヶ月分"},"資格3":{"月給":"120,000円","賞与":"基本給2ヶ月分","手当":"6,000円/月"}}')

資格2の月給を調べる

SQL

1SELECT job->"$.\"資格2\".\"月給\"" FROM tbl

投稿2018/11/06 09:08

編集2018/11/06 09:42
yambejp

総合スコア116663

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問