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



TEXT 类型的列 tasum 包含行。注释的开头在行首用两个 ** 字符标记。从此开始,应忽略列末尾的所有文本。如何在表扬行之前返回文本。例如,如果列包含文本

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 中是否有更好的方法,例如使用正则表达式子字符串?

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

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

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

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

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

这是在sqlfiddle中运行的代码

CREATE TABLE fuzz
        ( id INTEGER NOT NULL PRIMARY key
        , fuzz varchar
        );
INSERT INTO fuzz (id, fuzz) VALUES
(1, E'one ** TWO')
, (2, E'one ** COMMENTn two.')
, (3, E'one ** COMMENTn 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)

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

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

最新更新