我正在尝试通过删除相当常见的后缀来规范化数据字段。我已经在postgres中使用了 substring()函数,但是无法让它工作。例如,如果我想从任何具有它的值中删除后缀'xyz';
UPDATE my_table SET my_field=substring(my_field from '#"%#"xyz' for '#');
但这有一些奇怪的效果我无法确定。有什么想法吗?非常感谢。
答案 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子句不是绝对必要的,但会使更新更有效,因为只更新那些实际符合条件的行。