我正在尝试使用SELECT regexp_replace(m.*, '[\n\r]+', ' ', 'g')
从我的字段中删除回车符和新行,以便从我的表中生成CSV;但是,看起来我的postgresql版本(7.4.27)不支持该功能。
函数regexp_replace(成员,“未知”,“未知”,“未知”)不存在
我也尝试过这样做:
SELECT replace(replace(m.*, '\r', ''), '\n', '')
功能替换(成员,“未知”,“未知”)不存在
没有函数匹配给定的名称和参数类型。您可能需要添加显式类型转换。
或者这样:
SELECT replace(replace(m.*, chr(13), ''), chr(10), '')
函数replace(成员,文本,“未知”)不存在
仍然有类似的错误。
如何使用其他功能或解决方案实现?
答案 0 :(得分:1)
m.*
无论你把它放在哪里都没有意义。它会像这样工作:
SELECT replace(replace(m.some_column, chr(13), ''), chr(10), '')
FROM tbl m;
但这只是删除所有"换行"并且"回车"完全不是使用像原始字符一样的单个空格字符替换仅包含这些字符的每个字符串。如果这就是你想要的,translate()
单个字符替换更简单,更便宜 - 古代第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
看起来很尴尬,并且它不完美:因连续断线太多而失败。但即使在现代的Postgres中,它仍然可能比regexp_replace()
更快,因为正则表达式要贵得多。再说一次,表演可能不是问题。
升级到现代Postgres,你不需要这个。