Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Postgresql 如何在复合类型的Postgres数组中存储双引号?_Postgresql_Plpgsql - Fatal编程技术网

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

Postgresql 如何在复合类型的Postgres数组中存储双引号?,postgresql,plpgsql,Postgresql,Plpgsql,如何将双引号传递给复合类型的数组 当我用斜杠“退出双引号时,postgres似乎将其删除 我的服务器已设置标准\u字符串 使用此复合类型: CREATE TYPE public.type_strings AS ( string_one VARCHAR(500), string_two VARCHAR(1000) ); 并运行这段代码: DO $$ DECLARE v_strings public.type_strings[] := '{"(One,string with

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

当我用斜杠“退出双引号时,postgres似乎将其删除

我的服务器已设置标准\u字符串

使用此复合类型:

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)

感谢您的帮助!

使用三个转义双引号:

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中使用复合类型的数组是一种痛苦的方式,是一种时间和精力的浪费。在数据库世界中有更自然、更有效和更简单的替代方法。我鼓励您尝试找到它们。

“在Postgres中使用复合类型的数组是[…]时间和精力的浪费“-我完全同意@klin我们的服务使用复合类型的数组来传递数据行。我更倾向于使用JSON。您认为最好的格式是什么?在大多数情况下,一个复杂的结构可以作为几个相关的表在数据库中实现。这是一个模型解决方案,其中json可以作为数据交换的媒介。以json格式存储数据可能是一种简化的解决方案,通常效率较低,但设计更简单。@klin感谢您的评论,非常感谢。数据作为适当的数据类型(ints、varchar等)存储在规范化表中。我们只使用复合类型的数组作为函数参数。然而,在JSON中传递字符串似乎更容易。Postgres中的JSON需要一些练习,但确实很舒服。唯一的缺点是需要转换为原始类型,但这基本上是一件小事。