1

タイプ TEXT の列 tasumma には行が含まれています。コメントの開始は、行頭の 2 つの ** 文字でマークされます。これ以降、列の最後までのすべてのテキストを無視する必要があります。コメント行の前にテキストを返す方法。たとえば、列にテキストが含まれている場合

2*31
** This is multiline
comment starting with ** characters in start of line

2*31 を返す必要があります

表現してみた

 CASE when tasusumma like '%**%' then 
     substring( tasusumma for position( '**' in tasusumma)-1) 
 else tasusumma end

しかし、それは少し醜く見えます。

Postgres eq で regexp substring を使用するより良い方法はありますか?

4

3 に答える 3

1

@Bohemian の回答の修正として、regexp_replace を使用します。

regexp_replace(tasusumma, '\*\*.*', '', 'g')

http://sqlfiddle.com/#!1/d41d8/643

于 2012-12-23T15:01:29.550 に答える
0

正規表現抽出を使用できます。

substring(tasusumma from '.*(?=\*\*)')

これがsqlfiddleで実行されているこのコードです

于 2012-12-23T14:40:23.780 に答える
0
CREATE TABLE fuzz
        ( id INTEGER NOT NULL PRIMARY key
        , fuzz varchar
        );

INSERT INTO fuzz (id, fuzz) VALUES
(1, E'one ** TWO')
, (2, E'one ** COMMENT\n two.')
, (3, E'one ** COMMENT\n two.\*\* THREE')
        ;

SELECT f.id
        , regexp_replace ( f.fuzz, E'\\*\\*[^\n]*', '' , 'g' )
FROM fuzz f
        ;

結果:

NOTICE:  CREATE TABLE / PRIMARY KEY will create implicit index "fuzz_pkey" for table "fuzz"
CREATE TABLE
INSERT 0 3
 id | regexp_replace 
----+----------------
  1 | one 
  2 | one           +
    |  two.
  3 | one           +
    |  two.
(3 rows)

FROM the Fine Manual 注: standard_conforming_strings をオフにしている場合は、リテラル文字列定数に書き込むバックスラッシュを 2 倍にする必要があります。詳細については、セクション 4.1.2.1 を参照してください。

注: OP 要求とは対照的に、上記のコードは、'**' コメントが同じ行の最後で終了する必要があることを前提としています。次の行はコメントの一部とは見なされません。これは、'--' コメントが sql で処理される方法であり、'//' コメントが C または C++ で処理される方法です。

于 2012-12-23T15:02:42.797 に答える