假设我的表是:
id text
+-----+----------+
123 | foo bar
321 | bar "baz"
倾销时有没有办法逃避'baz'周围的报价?
我的查询格式为:
SELECT text FROM aTable WHERE ...
我希望输出为:
foo bar
bar \"baz\"
而不是:
foo bar
bar baz
答案 0 :(得分:7)
您可能想要使用replace
:
SELECT REPLACE(text, '"', E'\\"') FROM aTable WHERE ...
您需要转义转义字符以获取文字反斜杠(因此加倍反斜杠)并在替换字符串上使用“E”前缀以获得正确的escape syntax。
更新:感谢a_horse_with_no_name通常的严格(BTW是一件好事),我们有一个不需要额外反斜杠或非标准“E”前缀的解决方案:
set standard_conforming_strings = on;
SELECT REPLACE(text, '"', '\"') FROM aTable WHERE ...
standard_conforming_strings
选项告诉PostgreSQL使用SQL字符串的标准语法:
它控制普通字符串文字('...')是否按字面意思处理反斜杠,如SQL标准中所规定。
这也会影响您的\x5C
escape:
如果配置参数standard_conforming_strings已关闭,则PostgreSQL会识别常规字符串和转义字符串常量中的反斜杠转义。这是为了向后兼容历史行为,其中始终识别反斜杠转义。
答案 1 :(得分:1)
您可以使用COPY
命令的以下版本:
COPY (SELECT * FROM table) TO ... WITH FORMAT 'CSV', ESCAPE '<WHATEVER ESCAPE CHARACTER YOU WANT>'
您可能不需要做任何事情,因为在某些情况下,您的QUOTE
选项会自动加倍。请参考参考链接的示例。除了VALUES
之外,您还可以使用SELECT
。不需要进一步的数据修改。
假设您使用的是7.3或更高版本。 7.3和9.0之间的语法略有不同,因此请参阅相应的文档。