1

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

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,则您在文字字符串常量中编写的任何反斜杠都需要加倍。有关详细信息,请参阅第 4.1.2.1 节。

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

于 2012-12-23T15:02:42.797 回答