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

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

新規登録して質問してみよう
ただいま回答率
85.35%
Amazon Athena

Amazon Athenaは、標準SQLを使用してAmazon S3内のデータを直接分析することができるインタラクティブなクエリサービスです。

SQL

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

正規表現

正規表現とは特定の文字列によるパターンマッチングを行う際に用いられる宣言型プログラミングです。

Q&A

解決済

1回答

3218閲覧

SQLの正規表現で、URLクエリストリングから、指定したパラメータだけ残したい

kzmu

総合スコア17

Amazon Athena

Amazon Athenaは、標準SQLを使用してAmazon S3内のデータを直接分析することができるインタラクティブなクエリサービスです。

SQL

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

正規表現

正規表現とは特定の文字列によるパターンマッチングを行う際に用いられる宣言型プログラミングです。

0グッド

0クリップ

投稿2021/07/26 06:58

[ 実現したいこと ]
クエリストリングから、指定の識別子のパラメータセットだけをSQLの正規表現で抽出したい

以下のような、URLのクエリストリングが入っているカラムがあるとします。

例) '?a=123&bcd=345&ef=567&gh=789&abc=123'

ここから、指定した識別子(例えば、abc と bcd)だけを残して後は削除したいとします。

▼欲しい結果

'bcd=345&abc=123'

[ 実現したい環境 ]
・AWS Athena

[ 試したクエリ ]
①否定を使った置換

AthenaSQL

1SELECT regexp_replace('?a=123&bcd=345&ef=567&gh=789&abc=123','((^|?|&)?!(abc|bcd)=.*?(&|$))')

*abc=xxx でも bcd=xxx でもないものを置換して削除する

▼結果

'?a=123&bcd=345&ef=567&gh=789&abc=123' (何も置換されない)

"?!"の部分がどうもうまく聞いていないようです。

(参考)逆に"?!"を抜いて、対象だけを置換してみるとうまく抜けるようです。つまり、否定の部分だけが効いていないと思われます。

▼結果

?a=123ef=567&gh=789

②extract してjoin

AthenaSQL

1select array_join(regexp_extract_all('?a=123&bcd=345&ef=567&gh=789&abc=123','(?|&)((a|abc|bcd|gh)=.*?)(&|$)',2),'&')

▼結果

a=123&gh=789 (&~&が切り取られ、連続したパラメータを指定すると後ろのものが取れない)

後ろの "(&|$)"のものは最短マッチの判定だけに使いたいのですが、"[&$]"などとしても結果は同じです。
こちら、どのような指定方法があるか、わかる方ご教示いただけないでしょうか?

-> その他②で試してみたパターン
- select array_join(regexp_extract_all('?a=123&bcd=345&ef=567&gh=789&abc=123','(?|&)((a|abc|bcd|gh)=.*?)[&|$]',2),'&')
-> ②と同じ結果

  • select array_join(regexp_extract_all('?a=123&bcd=345&ef=567&gh=789&abc=123','(?|&)((a|abc|bcd|gh)=.*?)',2),'&')

   -> 最短マッチ部分が識別子だけになる (a=&bcd=&gh=&abc=)

  • select array_join(regexp_extract_all('?a=123&bcd=345&ef=567&gh=789&abc=123','(?|&)(a=.?|abc=.?|bcd=.?|gh=.?)',2),'&') ※同上

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

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

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

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

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

guest

回答1

0

自己解決

自己解決しました

[ 自己解決した方法 ]

'&' を '&&'にリプレースしてから抽出する

AthenaSQL

1select array_join(regexp_extract_all(replace('?a=123&bcd=345&ef=567&gh=789&abc=123','&','&&'),'(?|&)((a|abc|bcd|gh)=.*?)(&|$)',2),'&')

結果(正常)

a=123&bcd=345&gh=789&abc=123

ただ、あまり綺麗なやり方ではないように思っており、もしより良い方法があればご教示頂けますと幸いです。

投稿2021/07/26 07:08

kzmu

総合スコア17

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問