首页 > 解决方案 > Postgres 在文本字段中转义单引号和双引号

问题描述

我可能有一个奇怪的要求。我没有通过 Google 找到任何帮助。

我正在使用连接到 PostgreSQL 数据库的 DbVisualizer Pro 10.0.15 gui 工具。

我需要从数据库表创建一个 csv 文件。我在查询中选择我需要的记录,然后将结果导出到 .csv 文件。我可以很容易地做到这一点。

select note from notes;

highlight all results records >> right-click >> select export >> choose csv

一些记录在内容中同时包含单引号和/或双引号。

接收此文件的人需要将 csv 文件上传到另一个系统。他们声明内容中的这些单引号和双引号在他们的上传中不起作用。我被要求避开这些引用。他们希望将它们保留在内容中,但让它们出现在带有反斜杠转义字符的字段中,即:it is John's ball将在 csv 文件中显示为:it is John\'s ball。dbl-quotes 也是如此。

在创建 csv 文件后,我可能可以在文本编辑器中使用搜索和替换功能来做到这一点,但我想这可以通过 sql 来完成。

我试过玩这个regexp_replace()功能。

select regexp_replace(note, '"', '\"') as notes from notes适用于 dbl-quotes,但我对单引号没有任何运气。

帮助?有没有办法做到这一点?

标签: postgresqlcsvdbvisualizer

解决方案


您可以通过以下方式转义双引号:

postgres=# SELECT REGEXP_REPLACE('this "is" a string', '"', '\"', 'g');
     regexp_replace    
  ----------------------
  this \"is\" a string
  (1 row)

对于单引号,方法类似,但您必须使用另一个单引号将它们转义。因此,与其拥有类似的东西/',不如说它应该是''。查询是:

postgres=# SELECT REGEXP_REPLACE('this ''is'' a string', '''', '\''', 'g');
    regexp_replace    
----------------------
 this \'is\' a string
(1 row)

请注意最后的'g'标志,这会强制它替换所有出现的事件,而不仅仅是找到的第一个。

您也可以在单个语句中同时替换单引号和双引号,尽管它们被替换为相同的字符串(\"在本例中)。

postgres=# SELECT REGEXP_REPLACE('this "is" a ''normal'' string', '["'']', '\"', 'g');
         regexp_replace          
---------------------------------
 this \"is\" a \"normal\" string
(1 row)

推荐阅读