2012-01-18 13 views
0

この質問はPostgreSQL 8.3に関するものです。私はPostgreSQL 8.3のRegexの置き換え

NULL + INTERVAL '3 days' > TIMESTAMPTZ '2012-01-01' - INTERVAL '1 month' 

ような文字列を(も<、=または<>であり得る)>オペレータの双方を有する

は、タイムスタンプまたはNULLを含む+で追跡又は - 及び間隔の仕様。

タイムスタンプがNULLの場合は、 '+ INTERVAL'を3日間削除したいと考えています。これは正規表現では可能ですが、私はそれらを使うのが初めてです。私はこれをどのようにするべきですか?私が欲しいもののいくつかの例:

1)

NULL + INTERVAL '3 days' > TIMESTAMPTZ '2012-01-01' - INTERVAL '1 month' 

NULL + INTERVAL '3 days' > NULL - INTERVAL '1 month' 

NULL > NULL 
に変更する必要があります)

NULL > TIMESTAMPTZ '2012-01-01' - INTERVAL '1 month' 

2に変更する必要があります

3)

TIMESTAMPTZ '2012-01-01' + INTERVAL '3 days' > TIMESTAMPTZ '2012-02-01' - INTERVAL '1 month' 

は変更されないままにする必要があります。

+1

'' 'NULL + anything'''は' '' NULL'''と評価されるので、SQLで使用したい場合は文字列を変更する必要はありません。引用符を修正して、ちょっとランダムに見えるように、あなたの質問を編集してください:-)。 –

+0

このエラーのため真実かどうか疑問に思う: 'ERROR:operator does not exist:interval>タイムゾーンのないタイムスタンプ LINE 1:SELECT NULL + INTERVAL '22 days '> TIMESTAMP' 2011-12-2 ...' 。私はNULLに間隔を追加し、間隔とタイムスタンプを比較することはできません。さて、「タイムスタンプ」を後で追加したので、TIMESTAMPを持っていなければあなたの答えは正しいでしょう。とにかく、 'NULL + INTERVAL '1 day''は、タイムスタンプと比較するとNULLになります。 – Leonard

+0

@レオナード:ティムは絶対に正しいです、「NULL」と*何かが結びついているのは普遍的には「NULL」です。 **データ型**と**値**を混同しないでください。関係するデータ型の演算子が定義されている場合のみ、値を比較できます。これはPostgreSQLでは不可能です: 'SELECT NULL :: interval> NULL :: timestamp'。 –

答えて

2

正規表現は次のようになります。

SELECT regexp_replace(txt 
        , 'NULL [+-] INTERVAL ''.*?''' 
        , 'NULL' 
        , 'g') AS txt 
FROM (
    SELECT * FROM (VALUES 
    ('NULL + INTERVAL ''33 days'' > TIMESTAMPTZ ''2012-01-01'' - INTERVAL ''1 month''') 
    , ('NULL + INTERVAL ''3 days'' > NULL - INTERVAL ''1 month''') 
    , ('TIMESTAMPTZ ''2012-01-01'' + INTERVAL ''3 days'' > TIMESTAMPTZ ''2012-02-01'' - INTERVAL ''1 month''') 
    ) x(txt) 
) y 

戻り値:

        txt 
---------------------------------------------------------------------------------- 
NULL > TIMESTAMPTZ '2012-01-01' - INTERVAL '1 month' 
NULL > NULL 
TIMESTAMPTZ '2012-01-01' + INTERVAL '3 days' > TIMESTAMPTZ '2012-02-01' - INTERVAL '1 month' 

quantifier*?*の非欲張りバージョンです。

+0

ありがとうございます。私はすでに '。*'を使っていましたが、あまりにも貪欲でした。なぜ '?'を使うべきですか?それは私が必要なものを行う:)。 – Leonard

+0

@レナード:クール。私は情報と私の答えにリンクを追加しました。 –

+0

ありがとうございました、私はそれについて知りませんでした '*? ':)。完了! – Leonard

関連する問題