如何在PostgresQL中的新行和**字符之前返回文本

时间:2012-12-23 14:05:39

标签: sql postgresql

TEXT类型的列格式包含行。 评论开始在行首开头标有两个**字符。从这个开始,所有文本到列的结尾都应该被忽略。 如何在推荐行之前返回文本。例如,如果列包含文本

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 e.q.有更好的方法吗?使用regexp substring?

3 个答案:

答案 0 :(得分:1)

作为对@ Bohemian答案的修改,请使用regexp_replace:

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

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

答案 1 :(得分:0)

您可以使用正则表达式提取:

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

这是this code running in sqlfiddle

答案 2 :(得分: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)

来自Fine Manual 注意:如果关闭了standard_conforming_strings,则在文字字符串常量中写入的任何反斜杠都需要加倍。有关更多信息,请参见第4.1.2.1节。

注意:与OP请求相反,上述代码假定'**'注释应该在同一行的末尾结束;下一行被视为评论的一部分。这是在sql中处理' - '注释的方式,'//'注释在C或C ++中处理。