【问题标题】:Is there a regexp_replace equivalent for postgresql 7.4?postgresql 7.4 是否有 regexp_replace 等效项?
【发布时间】:2015-12-05 22:55:36
【问题描述】:

我正在尝试使用 SELECT regexp_replace(m.*, '[\n\r]+', ' ', 'g') 从我的字段中删除回车符和新行,以从我的表中生成 CSV;但是,看起来我的 postgresql 版本(7.4.27)不支持该功能。

函数 regexp_replace(members, "unknown", "unknown", "unknown") 不存在

我也尝试过这样做:

SELECT replace(replace(m.*, '\r', ''), '\n', '')

函数替换(成员,“未知”,“未知”)不存在

没有函数匹配给定的名称和参数类型。您可能需要添加显式类型转换。

或者这样:

SELECT replace(replace(m.*, chr(13), ''), chr(10), '')

函数替换(成员,文本,“未知”)不存在

仍然有类似的错误。

如何使用其他功能或解决方案来实现?

【问题讨论】:

  • 您可以随时升级。 7.x 不应该再使用了。
  • 很遗憾,升级此数据库不在我的控制范围内。

标签: postgresql psql


【解决方案1】:

m.* 放在哪里毫无意义。它会像这样工作:

SELECT replace(replace(m.some_column, chr(13), ''), chr(10), '')
FROM   tbl m;

但这只是完全删除了所有“换行符”和“回车符”字符,而不是像原来的那样用单个空格字符替换仅由这些字符组成的每个字符串。如果这是您想要的,使用translate() 替换单个字符会更简单、更便宜 - 也可在古代 pg 7.4 中使用:

SELECT translate(some_column, chr(13) || chr(10), '');

要实现您原来的 regexp_replace() 所做的事情(只是没有荒谬的 m.*),请识别一个不在字符串中的字符并将其用作垫脚石。说:°没有弹出,那么:

SELECT replace(replace(replace(
        translate(some_column, chr(13) || chr(10), '°')  -- replace with dummy
      , '°°', '°')  -- consolidate to single dummy
      , '°°', '°')  -- repeat as many times as necessary
      , '°', ' ');  -- replace dummy with space

看起来很尴尬,而且不完美:连续换行太多失败。但它可能仍然比regexp_replace() 快,即使在现代 Postgres 中也是如此,因为正则表达式要昂贵得多。再说一次,性能在这里可能不是问题。

升级到现代 Postgres,你就不需要这个了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-26
    相关资源
    最近更新 更多