我试图通过删除一个相当常见的后缀来规范化数据字段。我已经在 postgres 中使用substring()函数,但不能完全让它工作。例如,如果我想从任何具有它的值中去除后缀“xyz”;
UPDATE my_table SET my_field=substring(my_field from '#"%#"xyz' for '#');
但这会产生一些我无法确定的奇怪影响。有什么想法吗?非常感谢一如既往。
我试图通过删除一个相当常见的后缀来规范化数据字段。我已经在 postgres 中使用substring()函数,但不能完全让它工作。例如,如果我想从任何具有它的值中去除后缀“xyz”;
UPDATE my_table SET my_field=substring(my_field from '#"%#"xyz' for '#');
但这会产生一些我无法确定的奇怪影响。有什么想法吗?非常感谢一如既往。
UPDATE my_table
SET my_field = left(my_field, -3)
WHERE my_field LIKE '%xyz';
有几个原因:
如果您不想更改每一行,请始终在. 即使表达式实际上只更改了某些行。从相同的值到相同的值仍然是一个并且会产生死行和表膨胀并触发触发器......WHERE
UPDATE
UPDATE
UPDATE
left()
与 结合使用LIKE
。
left()
使用负的第二个参数有效地修剪字符串末尾的字符数。left()
是在 PostgreSQL 9.1 中引入的。我在这里引用手册:当 n 为负时,返回除最后一个以外的所有 |n| 人物。
LIKE
正则表达式 ( )。没有那么通用,但速度更快。(在内部被重写为正则表达式)。dba.SE 上此相关答案中的详细信息。~
LIKE
SIMILAR TO
如果要确保保留最少的字符:
WHERE my_field LIKE '_%xyz'; -- prepend as many _ as you want chars left
substring()
会像这样工作(一种可能性):
substring(my_field, '^(.*)xyz$');
update my_table
set my_field = regexp_replace(my_field, 'xyz$', '')
where my_field ~ 'xyz$';
这也会将值更改'xyz'
为空字符串。我不知道你是否想要(或者后缀是否可以“独立”存在。
where 子句不是绝对必要的,但会使更新更有效,因为只有那些实际满足条件的行才会被更新。