Postgres将varchar字段设置为自身的正则表达式

时间:2012-07-18 14:29:52

标签: regex postgresql

我正在尝试通过删除相当常见的后缀来规范化数据字段。我已经在postgres中使用了 substring()函数,但是无法让它工作。例如,如果我想从任何具有它的值中删除后缀'xyz';

UPDATE my_table SET my_field=substring(my_field from '#"%#"xyz' for '#');

但这有一些奇怪的效果我无法确定。有什么想法吗?非常感谢。

2 个答案:

答案 0 :(得分:1)

UPDATE my_table
SET    my_field = left(my_field, -3)
WHERE  my_field LIKE '%xyz';

有几个原因:

  • 如果您不想更改每一行,始终会在您的WHERE中添加UPDATE条款。即使表达式实际上只改变了一些行。从相同值到相同值的UPDATE仍然是UPDATE并且将产生死行和表膨胀以及触发器触发器......

  • left()LIKE结合使用。

      带有负秒参数的
    • left()有效地修剪了字符串末尾的字符数。 PostgreSQL 9.1引入了left()。我引用手册here
      

    当n为负时,返回除最后| n |之外的所有内容字符。

    • 如果可以,请始终在正则表达式(LIKE)上选择~LIKE不是多才多艺,而是更快。 (SIMILAR TO在内部被重写为正则表达式)。详情请见related answer on dba.SE


如果您想确保保留最少的字符:

WHERE  my_field LIKE '_%xyz'; -- prepend as many _ as you want chars left

substring()会像这样工作(一种可能性):

substring(my_field, '^(.*)xyz$');

答案 1 :(得分:1)

update my_table
   set my_field = regexp_replace(my_field, 'xyz$', '')
where my_field ~ 'xyz$';

这也会将值'xyz'更改为空字符串。我不知道你是否想要那个(或者如果后缀可以“存在于它自己的身上”。

where子句不是绝对必要的,但会使更新更有效,因为只更新那些实际符合条件的行。