PostgreSQL嵌套UDT和CAST语法

时间:2018-03-21 12:25:29

标签: postgresql types casting

我的UD类型很少:

CREATE TYPE SOME_TYPE AS (
    aaa INT,
    bbb TEXT
);
CREATE TYPE SOME_ANOTHER_TYPE AS (
    ccc int,
    ddd SOME_TYPE
);
CREATE TYPE SOME_ANOTHER_DAMNIT_TYPE AS (
    eee int,
    fff SOME_ANOTHER_TYPE
);

好的,我可以先用SQL编写:

select '(123,blablabla)'::SOME_TYPE;

我可以成为第二名:

select '(456, "(123,blablabla)")'::SOME_ANOTHER_TYPE;

但如果我试着做第三个......

select '(789,"(456, "(123,blablabla)")")'::SOME_ANOTHER_DAMNIT_TYPE;

... pl throw错误:

  

[22P02]错误:记录字面错误:“(456,”(123Подробности:

     

输入意外结束。

问题:如何在没有plpgsql的情况下制作第三种类型?我需要它来从jdbc调用,以传输对象。我知道,我可以“扁平化”这个物体,但我想把它“原样”转移。

1 个答案:

答案 0 :(得分:1)

问题是您嵌套了引号而没有转义内部引号。你可以这样:

select '(789,"(456, ""(123,blablabla)"")")'::SOME_ANOTHER_DAMNIT_TYPE;

即。通过加倍"

对于您的情况,我建议您避免将记录值表示为text,以便稍后将其作为您的类型投射。您可以直接指定记录值,而无需通过text,如下所示:

select (789,(456, (123,'blablabla')))::SOME_ANOTHER_DAMNIT_TYPE;