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?
答案 0 :(得分:1)
作为对@ Bohemian答案的修改,请使用regexp_replace:
regexp_replace(tasusumma, '\*\*.*', '', 'g')
答案 1 :(得分:0)
答案 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 ++中处理。