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++ 中处理"//"注释的方式。