这个合法的(!)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转换?
答案 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 数据类型),但这与问题正交。
相关: