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

问题描述 投票:0回答:1

此合法(!)

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 到 JSON 转换?

json postgresql casting polymorphism
1个回答
5
投票

反过来做:

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

将“hello”声明为类型

text
。 这样您就可以将
1
保留为数字,将
'hello'
保留为字符串。
显式转换
'hello'::text
是等效的。

原因是 Postgres 类型系统。不带引号的

1
是合法的数字常量,默认为 Postgres 数据类型
integer
。但是
'hello'
(带单引号)是一个字符串文字,以类型
unknown
开头。函数
to_json()
是多态的,其输入参数定义为
ANYELEMENT
。输出取决于输入数据类型。而且它不知道如何处理数据类型
unknown
。因此出现错误消息。

无论哪种情况,结果数据类型都是

json
(这是常规 Postgres 数据类型),但这与问题正交。

相关:

© www.soinside.com 2019 - 2024. All rights reserved.