【问题标题】:postgresql replace function using pattern matching characterspostgresql 使用模式匹配字符替换函数
【发布时间】:2015-11-09 14:45:11
【问题描述】:

我在 postgresql 数据库中有一个名为“OptionsDetail”的表,其列名为“URL”。 “URL”列包含以下数据

网址

http://www.site1.com/ebw/file1/detail.action?cid=1
http://www.another2.com/ebw/file1/detail.action?cid=11&code=MYCODE
http://www.anothersite3.com/ebw/file1/detail.action?cid=12&code=ANOTHERCODE&option=ROOM

现在我想将 URL 中的数据替换为

网址

/file1/detail.action?cid=1
/file1/detail.action?cid=11&code=MYCODE
/file1/detail.action?cid=12&code=ANOTHERCODE&menu=ROOM

我编写了以下查询来执行上述功能

 UPDATE  "OptionsDetail" SET "URL" = replace("URL",'http://%/ebw/file1','/file1') WHERE  "URL" LIKE  '%/ebw/file1%';

还有我这样写的另一种方式

  UPDATE  "OptionsDetail" SET "URL" = replace("URL",'%/ebw/file1','/file1') WHERE  "URL" LIKE  '%/ebw/file1%';

查询正在成功执行,例如:200 行受影响,但“URL”列数据没有改变我需要的方式,数据保持原样。

请帮我解决这个问题

【问题讨论】:

  • replace 不支持通配符。你想要regexp_replace

标签: sql postgresql


【解决方案1】:

问题是replace 不支持像% 这样的通配符:

replace("URL",'http://%/ebw/file1','/file1')
                     ^^^

您可以改用regexp_replace

UPDATE  YourTable
SET     URL = regexp_replace(URL, 'http://.*/ebw/file1', '/file1') 
WHERE   URL LIKE '%/ebw/file1%'

请注意,regexp_replace 使用的通配符与 like 不同。在正则表达式中,“任意数量的任意字符”是.*,而不是%

See it working at SQL Fiddle.

【讨论】:

  • 我注意到的一件事是,如果您在regexp_replace 中使用% 而不是.,它充当非捕获通配符,因此它匹配的任何内容都不会被替换.
猜你喜欢
  • 1970-01-01
  • 2021-01-26
  • 2014-03-22
  • 2012-09-23
  • 2016-04-29
  • 2014-09-03
  • 1970-01-01
  • 2014-08-20
  • 2022-01-02
相关资源
最近更新 更多