sql >> データベース >  >> RDS >> PostgreSQL

regexp_matchesの結果から2番目の一致を取得します

    REGEXP_REPLACEを使用できます :

    SELECT REGEXP_REPLACE('1234567 - 7654321 - some - more - text', '^\d+[^\d]+(\d+).*$', '\1');
    

    出力

    7654321
    

    この正規表現は、いくつかの桁数で始まる文字列を検索します(^\d+ )の後に数字以外の文字([^\d]+ )、次に別の数字のグループ((\d+) )文字列の終わりまでいくつかの文字が続きます(.*$ )。 () 数字の2番目のグループの周りに、キャプチャグループが作成されます。これは、置換文字列で\1を使用して参照できます。 。 REGEXP_REPLACE以降 正規表現に一致する文字列の部分のみを置き換えます。全体に一致する正規表現が必要です。 必要なデータだけに置き換えるための文字列。

    更新

    最初の数字の前に文字が含まれている可能性がある場合は、正規表現を次のように変更する必要があります

    ^[^\d]*\d+[^\d]+(\d+).*$
    

    アップデート2

    最初に数字のセットが1つしかない可能性がある場合は、最初の部分の一致をオプションにする必要があります。キャプチャしていないグループでそれを行うことができます:

    ^[^\d]*(?:\d+[^\d]+)?(\d+).*$
    

    これにより、最初の数字のセットでの一致がオプションになり、存在しない場合(つまり、数字のセットが1つしかない場合)、正規表現は引き続き一致します。非キャプチャグループを使用する(?:を追加する) グループの先頭まで、置換文字列を\1から変更する必要はありません。 。 SQLFiddle を更新しました



    1. SQLでの循環参照の検出

    2. オプションのパラメータでpostgresをクエリする方法は?

    3. Microsoftは3値フィールドを1ビットに格納できますか?

    4. ストアドプロシージャ名の最大長があるのはなぜですか?