此合法(!)
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 转换?
反过来做:
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 数据类型),但这与问题正交。
相关: