2012-01-25 13 views
0

postgresqlでは、特定の列のフィールドから3つの特定の英数字を抽出し、そこから年を作成する必要があります。フィールドの値がFUT,GRA,S12,1055559またはS11,1050830,PONの場合は、S11またはS12が必要で、2011または2012を作成する必要があります。 結果はテキストフィールドのままです。Postgresの正規表現regexp_split_to_array

私はS??を入手するために以下を使用しました:substring(my_field from E'(S\\d\\d),') しかし、年を作成するのは難しいようです。私はregexp_split_to_arrayを使用したいと思っていましたが、うまく動作していないようです。あなたはほとんどそこにいるように見える

答えて

2

は - あなただけ抽出された12 ''/'11' から '20' を追加する必要があります。

UPDATED(PostgreSQLには何の境界\bを持っていません(?! )):

SELECT '20'||substring(my_field from E'(?:^|\\W)S(\\d\\d)(?!\\w)') .... 

-- NOTE: Old version. However there's no '\b' in this regex flavour. 
SELECT '20'||substring(my_field from E'\\bS(\\d\\d)\\b') .... 

バックスラッシュを二重エスケープする必要があります。また、正規表現で角括弧を使用すると、選択された部分文字列は '12'または '11'になり、 'S'は含まれません。 '20'||xxxxは、2つの文字列を連結するだけです。

(?:^|\\W)は、Sxxが文字列の先頭にあるか、スペース以外の文字(スペースやカンマなど)の前にあることを確認します。これにより、FUT,GRAS13,S12S13が一致しなくなります。

(?!\\w)は、Sxxの後に別の単語文字がないことを確認します(つまり、大きな単語の一部ではありません)。これにより、S132,GRA,S12に一致するS13が表示されなくなります。

(注 - 、PostgreSQLの正規表現にはword boundaryはありません、私は以前、「単語の境界」を意味\bがあったが、PostgreSQLの正規表現はそれをサポートしていませんので、(?:^|\W)(?!\w)はそれをシミュレートする方法があり

+0

AFAIK、PostgreSQLの正規表現には単語境界はありません。\ bはバックスペースを意味します。 – Toto

+0

そうです、http://www.postgresql.org/docs/9.1/static/functions-matching.html#POSIX-LIMITS-COMPATIBILITY – araqnid

+0

ああ、それは残念です。 Lookaheadはサポートされていますが、Lookbehindではサポートされていません。乾杯! –

1

私の知る限り。 \bはバックスペースを意味

私はどうなる:。

SELECT '20'||substring('FUT,GRA,S12,1055559' from E'\\WS(\\d{2})\\W') 

\Wを意味する:ない単語の文字を