奇怪的JSON解释(多态类型),如何解决?

时间:2017-07-24 13:48:31

标签: json postgresql casting polymorphism

这个合法的(!)CASE结构返回一个JSON数据类型:

 SELECT CASE WHEN true THEN to_json(1) ELSE to_json('hello') END;

但:

  

错误:无法确定多态类型,因为输入类型为"未知"

它不是"多态",它是JSON。

...因此,正如糟糕的解决方法(丢失数字/字符串JSON表示),

 SELECT to_json(CASE WHEN true THEN 1::text ELSE 'hello' END);

有没有更好的方法来执行此SQL-to-JSON转换?

1 个答案:

答案 0 :(得分:2)

反过来说:

SELECT CASE WHEN true THEN to_json(1) ELSE to_json(text 'hello') END;

I.e。:声明'你好'作为类型text。 这样,您可以将1保留为数字,将'hello'保留为字符串。

显式演员('hello'::text)也可以解决问题。但是将常量直接声明为text会稍微有效。

原因是Postgres类型系统。不带引号的1是合法的数字常量,默认为Postgres数据类型integer。但是'hello'只是一个以unknown类型开头的字符串文字。函数to_json()是多态的,这意味着它的输入参数被定义为ANYELEMENT。实际上它取决于输入数据类型。它不知道如何处理数据类型unknown。因此错误信息。

结果数据类型在任何一种情况下都是json(这是一种常规的Postgres 数据类型),但这与问题正交。

相关: