[解決済み] パターンによる雪片の部分文字列
2022-03-08 20:12:55
質問
テーブルの中に以下のような文字列のカラムがあります。
accountNumber:123456
{"accountNumber":"123456"}
これらの文字列から123456のみを抽出する動的な方法が必要です。解決策を提案してもらえますか?
どのように解決するのですか?
使用方法
その
REGEXP_SUBSTR(…)
組み込み関数
を使い、正規表現パターンで部分文字列を抽出します。
各列の値に数字が1つしか入らない場合は 数値パターン または 数値文字範囲 の構文で十分です。
SELECT
'accountNumber:123456' i1,
regexp_substr(i1, '[0-9]+') r1,
'{"accountNumber":"123456"}' i2,
regexp_substr(i2, '[0-9]+') r2;
+----------------------+--------+----------------------------+--------+
| I1 | R1 | I2 | R2 |
|----------------------+--------+----------------------------+--------|
| accountNumber:123456 | 123456 | {"accountNumber":"123456"} | 123456 |
+----------------------+--------+----------------------------+--------+
数字がちょうど6桁の幅になる場合は
{n}
繰り返し構文
:
select
'accountNumber:123456,anotherNumber:123' i1,
regexp_substr(i1, '[0-9]{6}') r1,
'{"accountNumber":"123456", "anotherNumber": 123}' i2,
regexp_substr(i2,'[0-9]{6}') r2;
+----------------------------------------+--------+--------------------------------------------------+--------+
| I1 | R1 | I2 | R2 |
|----------------------------------------+--------+--------------------------------------------------+--------|
| accountNumber:123456,anotherNumber:123 | 123456 | {"accountNumber":"123456", "anotherNumber": 123} | 123456 |
+----------------------------------------+--------+--------------------------------------------------+--------+
番号がテキストにのみ続く必要がある場合
accountNumber
を導入することができます。
(キャプチャグループ)
:
select
'accountNumber:123456,anotherNumber:123,somethingElse:456789' i1,
regexp_substr(i1, 'accountNumber[:" ]+([0-9]{6})', 1, 1, 'e', 1) r1,
'{"accountNumber":"123456", "anotherNumber": 123, "somethingElse": 456789}' i2,
regexp_substr(i2, 'accountNumber[:" ]+([0-9]{6})', 1, 1, 'e', 1) r2;
+-------------------------------------------------------------+--------+---------------------------------------------------------------------------+--------+
| I1 | R1 | I2 | R2 |
|-------------------------------------------------------------+--------+---------------------------------------------------------------------------+--------|
| accountNumber:123456,anotherNumber:123,somethingElse:456789 | 123456 | {"accountNumber":"123456", "anotherNumber": 123, "somethingElse": 456789} | 123456 |
+-------------------------------------------------------------+--------+---------------------------------------------------------------------------+--------+
完全に正しい正規表現を構築するには、データで起こりうるすべての差異について、より多くの知識が必要になります。以下のようなサイトで、良いテストセットを使って対話的にパターンを構築してみてください。 Regex101 , RegExr などがあり、開発がしやすくなっています。
備考
: データがJSON形式である場合、Snowflakeは以下のことを許可します。
にパースします。
VARIANT
データ型
から
より自然に問い合わせることができる
:
select
parse_json('{"accountNumber":"123456", "anotherNumber": 123, "somethingElse": 456789}'):accountNumber::integer account_number;
+----------------+
| ACCOUNT_NUMBER |
|----------------|
| 123456 |
+----------------+
関連
-
[解決済み】Excelに合体的な関数はありますか?
-
[解決済み] リンクされたサーバーの NULL に対して OLE DB プロバイダー Microsoft.Jet.OLEDB.4.0 のインスタンスを作成できません。
-
[解決済み] SQLサーバーで文字列をsmalldatetimeデータ型に変換する際、変換に失敗しました(静的値を除く)。
-
[解決済み] 各グループの上位1行を取得
-
[解決済み] SQLite - UPSERT *not* INSERT or REPLACE
-
[解決済み] フラットテーブルをツリーにパースする最も効率的/エレガントな方法は何ですか?
-
[解決済み] 別のテーブルに一致する項目がない行を選択するにはどうすればよいですか?
-
[解決済み] MySQLで重複した行を削除する
-
[解決済み】SQL Serverテーブルカラムの文字列を置換する方法
-
[解決済み] SQL select join: すべてのカラムに 'prefix.*' というプレフィックスを付けることは可能ですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】オペランド型の衝突:intはdateと互換性がない + INSERT文はFOREIGN KEY制約と衝突した
-
[解決済み] アンピボットの主キーを含む対象コードページで、テキストが切り捨てられたか、1つ以上の文字が一致しない。
-
[解決済み] 2つの列を分割するには?
-
[解決済み] ORA-01790: 式は、対応する式と同じデータ型でなければならないエラーが発生するケース
-
[解決済み] ora-06553 pls-306 'ogc_x' の呼び出しで引数の数または種類が誤っている。
-
[解決済み] 検索エラー ORA-00932: 不整合なデータ型: 期待された DATE は NUMBER になりました。
-
[解決済み] nvarchar 値 ... をデータ型 int に変換する際に、変換に失敗しました。
-
[解決済み] ORA-01821: ISO 8601 のローカルタイム付き日付のフォーマットが認識されないエラー
-
[解決済み] ORA-00997: LONG データタイプの不正使用に対する回避策
-
[解決済み] Oracle Trigger ORA-04098: トリガーが無効で、再バリデーションに失敗しました。