如何在复合类型的Postgres数组中存储双引号?

时间:2018-12-20 05:55:17

标签: postgresql plpgsql

如何将双引号传递给复合类型的数组?

当我用斜杠转义双引号“时,似乎postgres将其删除。

我的服务器的standard_conforming_strings设置为ON。

使用此复合类型:

CREATE TYPE public.type_strings AS (
    string_one VARCHAR(500),
    string_two VARCHAR(1000)
);

并运行以下代码块:

DO $$
DECLARE
    v_strings public.type_strings[] := '{"(One,string with \"quotes\")","(Two,string with \\\\slash\\\\ + ''apos'' + \\,comma\\, + (parens\\))"}';

BEGIN

    DROP TABLE IF EXISTS _results;
    CREATE TEMPORARY TABLE _results AS
    SELECT 
        string_one,
        string_two
    FROM UNNEST(v_strings) x(
        string_one,
        string_two);

END $$;

SELECT * FROM _results;

产生以下结果:

string_one      string_two
----------      -------------------------------------------------
One             string with quotes
Two             string with \slash\ + 'apos' + ,comma, + (parens)

请注意第一行中缺少双引号。我想知道如何对双引号进行转义,以便保留双引号,如下所示:

string_one      string_two
----------      -------------------------------------------------
One             string with "quotes"
Two             string with \slash\ + 'apos' + ,comma, + (parens)

感谢您的帮助,谢谢!

1 个答案:

答案 0 :(得分:1)

使用三个转义的双引号:

select *
from unnest('{"(One,string with \"\"\"quotes\"\"\")","(Two,unimportant)"}'::type_strings[]);

 string_one |      string_two      
------------+----------------------
 One        | string with "quotes"
 Two        | unimportant
(2 rows)    

还有更令人愉快的语法:

select *
from unnest (array[('One', 'string with "quotes"'), ('Two', 'unimportant')]::type_strings[]);

尽管如此,在Postgres中使用复合类型的数组是一种折磨的方法,浪费时间和精力。数据库世界中有更自然,更有效和更简单的替代方法。我鼓励您尝试找到它们。