PostgreSQL将字符替换为字符串右侧

时间:2014-12-15 18:26:44

标签: string postgresql replace wildcard

我需要通过删除街道名称右侧的所有内容来清理PostgreSQL 8.4中的地址字段。这包括放弃套房(“100 Broadway Street Suite 100”)并更正街道名称(“100 Broadway Street100”)附加单位编号的名称,以便两种情况下的结果都是“百老汇街100号”。

基本上我试图删除“街道”右侧的所有内容。如果不对每种情况单独编码,我似乎无法使用替换功能。 rtrim函数也不起作用,因为我想删除的字符是通配符。

以下是我想要开始工作的内容:

update *tablename* set *fieldname* = replace (*fieldname*, '%STREET%', '%STREET')

下面这个SQL有效,但我不想编写每个可能的组合:

UPDATE *tablename* set *fieldname* = replace (*fieldname*, ' SUITE 100', '');
UPDATE *tablename* set *fieldname* = replace (*fieldname*, ' STREET100', ' STREET');

如何删除字符串“Street”右侧的所有内容,而不明确指定“Street”后面的内容?

感谢您的帮助。

2 个答案:

答案 0 :(得分:1)

尝试这样的事情:

SELECT regexp_replace('100 broadway street 100', '(.*)(Street).*', '\1\2', 'i');

上面基本上是在找" Street" (根据最后一次' i' agrument的情况不敏感,然后在" Street"之后剥离一切,我认为这是你要求的。有关详细信息,请参阅http://www.postgresql.org/docs/current/static/functions-matching.html

答案 1 :(得分:0)

这会在' STREET'

的第一个实例之后截断
UPDATE tablename
  SET fieldname = SUBSTR(fieldname, 1, position('STREET' IN fieldname) + 5)
  WHERE fieldname LIKE '%STREET%'

更新:如果希望对" STREET"进行不区分大小写的搜索:

UPDATE tablename
  SET fieldname = SUBSTR(fieldname, 1, position('STREET' IN UPPER(fieldname)) + 5)
  WHERE UPPER(fieldname) LIKE '%STREET%'