我可以执行
SELECT to_json(1)
SELECT to_json(1.4)
SELECT to_json('this is a nice json text')
SELECT to_json('{"become":"json"}')
SELECT to_json('null')
这一切都正常,但是当你执行时:
SELECT to_json(NULL::TEXT)
你实际上把postgres内置为NULL,就像没有真正发生过一样,当我期待与to_json('null')
相同的结果时,你可能期望SELECT to_json(someText)::TEXT FROM ...
"input"
,"stuff"
,""
和null
,而是获得"input"
,"stuff"
,""
和
我的问题是,为什么SELECT to_json(NULL::TEXT)
没有给你一个json null,而只是一个NULL指针?为什么它在postgres中实现?一些具体原因?
答案 0 :(得分:3)
to_json
被标记为STRICT
函数,它的意思是 - 当任何参数为NULL时返回NULL。我不确定它是否是正确的实现,也许它是PostgreSQL的bug。
更新:在讨论Postgres的邮件列表后,这不是错误,而是功能 - 情况并非简单,因此两种语言都支持NULL,但NULL的行为在这些语言中略有不同。很难确定是否必须立即将SQL NULL转换为JSON NULL并立即丢失SQL行为。如果您需要不同的行为,可以使用SQL函数:
CREATE OR REPLACE FUNCTION to_json2(anyelement)
RETURNS json AS $$
SELECT COALESCE(to_json($1), json 'null')
$$ LANGUAGE sql;
答案 1 :(得分:0)
Pavel Stehule的answer很不错,它使我想到了一个更简单的解决方案:
SELECT 'null'::json;