如何将 PostgreSQL JSON 数据字符串化?
How to stringify PostgreSQL JSON data?
我见过很多类似的问题(例如 this one),但找不到有帮助的问题。我正在寻找 Javascript 的 JSON.stringify()
的等效项,但对于 PostgreSQL。
例如:
db=# \pset null
Null display is "(null)".
db=# create table x(c1 json);
CREATE TABLE
db=# insert into x (c1) values (null), ('"blah"'::json), ('{"a":1}'::json);
INSERT 0 3
db=# select * from x;
c1
---------
(null)
"blah"
{"a":1}
(3 rows)
db=# select '''' || c1::text || '''' from x;
?column?
-----------
(null) --- this is wrong, should be 'null'
'"blah"'
'{"a":1}'
(3 rows)
db=# select '''' || (c1 #>> '{}') || '''' from x;
?column?
-----------
(null) --- this is wrong, should be 'null'
'blah' --- this is wrong, should be '"blah"'
'{"a":1}'
(3 rows)
db=# select '''' || case when c1 is null then 'null' else c1::text end || '''' from x;
?column?
-----------
'null'
'"blah"'
'{"a":1}'
(3 rows)
最后一个例子可以不用 CASE...END
子句吗?它对所有可能的输入总是正确的吗?
您将 JSON null 与 SQL NULL 混淆了。在此处 JSON type:
Table 8.23. JSON Primitive Types and Corresponding PostgreSQL Types
JSON primitive type PostgreSQL type Notes
...
null (none) SQL NULL is a different concept
所以:
insert into x (c1) values ('null'), ('"blah"'::json), ('{"a":1}'::json);
select '''' || c1::text || '''' from x;
?column?
-----------
'null'
'"blah"'
'{"a":1}'
我见过很多类似的问题(例如 this one),但找不到有帮助的问题。我正在寻找 Javascript 的 JSON.stringify()
的等效项,但对于 PostgreSQL。
例如:
db=# \pset null
Null display is "(null)".
db=# create table x(c1 json);
CREATE TABLE
db=# insert into x (c1) values (null), ('"blah"'::json), ('{"a":1}'::json);
INSERT 0 3
db=# select * from x;
c1
---------
(null)
"blah"
{"a":1}
(3 rows)
db=# select '''' || c1::text || '''' from x;
?column?
-----------
(null) --- this is wrong, should be 'null'
'"blah"'
'{"a":1}'
(3 rows)
db=# select '''' || (c1 #>> '{}') || '''' from x;
?column?
-----------
(null) --- this is wrong, should be 'null'
'blah' --- this is wrong, should be '"blah"'
'{"a":1}'
(3 rows)
db=# select '''' || case when c1 is null then 'null' else c1::text end || '''' from x;
?column?
-----------
'null'
'"blah"'
'{"a":1}'
(3 rows)
最后一个例子可以不用 CASE...END
子句吗?它对所有可能的输入总是正确的吗?
您将 JSON null 与 SQL NULL 混淆了。在此处 JSON type:
Table 8.23. JSON Primitive Types and Corresponding PostgreSQL Types
JSON primitive type PostgreSQL type Notes
...
null (none) SQL NULL is a different concept
所以:
insert into x (c1) values ('null'), ('"blah"'::json), ('{"a":1}'::json);
select '''' || c1::text || '''' from x;
?column?
-----------
'null'
'"blah"'
'{"a":1}'