从文本列

时间:2017-09-03 07:18:52

标签: regex postgresql pattern-matching plpgsql postgresql-9.3

我有以下SQL结果条目。

Result
---------
TW - 5657980 Due Date updated :  to <strong>2017-08-13 10:21:00</strong> by <strong>System</strong> 
TW - 5657980 Priority updated  from <strong> Medium</strong> to <strong>Low</strong> by <strong>System</strong> 
TW - 5657980 Material added: <strong>1000 : Cash in Bank - Operating (Old)/ QTY:2</strong> by <strong>System</strong>#9243  
TW - 5657980 Labor added <strong>Kelsey Franks / 14:00 hours </strong> by <strong>System</strong>#65197

现在我尝试从此结果中提取简短描述并尝试将其迁移到同一个表中的另一列。

Expected result
--------------
Due Date Updated
Priority Updated
Material Added
Labor Added

忽略前13个字符。对于大多数情况,它以更新&#39;结束。几乎没有结束&#39;添加&#39;。它应该不区分大小写 有没有办法得到预期的结果。

1 个答案:

答案 0 :(得分:1)

substring()使用正则表达式的解决方案。它跳过前13个字符,然后将字符串带到第一个'updated''added',不区分大小写,带有引导空白。其他NULL

SELECT substring(result, '(?i)^.{13}(.*? (?:updated|added))')
FROM   tbl;

正则表达式解释说:

(?i) .. meta-syntax切换到不区分大小写的匹配
^ ..字符串的开头
.{13} ..跳过前13个字符
() ..捕获括号(捕获有效载荷)
.*? ..任意数量的字符(non-greedy
(?:) ..非捕获括号
(?:updated|added) .. 2个分支(字符串以'updated'或'added'结尾)

如果我们不能依赖13个主要字符like you later commented,我们需要一些其他可靠的定义。与实际实施相比,您的困难似乎比朦胧的要求更多。

说,我们正在处理一个或多个非数字,后跟一个或多个数字,一个空格,然后是上面定义的有效负载:

SELECT substring(result, '(?i)^\D+\d+ (.*? (?:updated|added))') ...

\d ..班级简写为数字
\D ..非数字,与\d

相反