有没有一种有效的方法从Postgres中的列值中删除子串?

时间:2014-11-20 23:50:45

标签: regex postgresql

我有一个名为user_response的列,我想在其上执行各种操作,例如取出引号中包含的单词,并在冒号(:)后取出字符串的一部分

这样的一个操作是这样的: 让我们说一个记录

user_response = "My company: 'XYZ Co.' has allowed to use:: the following \n \n kind of product: RealMadridTShirts"

现在,我想在最后一个冒号(:)之后刮掉字符串的一部分。因此,我的输出应该是RealMadridTShirts

我可以通过以下黑客以某种方式实现这一点:

SELECT reverse(split_part(reverse(user_response), ' :', 1))

但是,这非常低效,特别是当我不得不超过500,000行时。这不是我一整天都要做的手术。此操作适用于每天一次的负载,但即便如此负载也变得非常昂贵。

来自Oracle,我知道我可以使用INSTR和SUBSTR函数以更优雅的方式实现它(无需反转字符串等等。

另外,如果我必须在第二次冒号后刮掉文本怎么办?

1 个答案:

答案 0 :(得分:1)

在最后一个冒号后找到字符串,对吗?

  

我的公司:' XYZ Co。'允许使用::以下\ n \ n种产品:RealMadridTShirts

使用正则表达式是微不足道的:

regress=> SELECT (regexp_matches(
                      'My company: ''XYZ Co.'' has allowed to use:: the following \n \n kind of product: RealMadridTShirts',
                      '.*:(.*?)$')
                 )[1];
   regexp_matches   
--------------------
  RealMadridTShirts
(1 row)

显然缺少一个函数来请求从特定起点开始计算字符串的位置使得在不使用正则表达式的情况下更难做,但是因为正则表达式肯定是解决这个问题的最快方法我怀疑&# 39;是个问题。

更大的问题可能是您正在扫描如此多的数据。这永远不会很快。