如何将to_jsonb用作row_to_jsonb?关于"how much"的详细信息在哪里?
How to use to_jsonb as row_to_jsonb? Where the details about "how much"?
我在“JSON 模式”下在 pg9.4 上测试了一些查询,现在我正在检查 pg9.5 是否会带来所有相同的 JSONB 功能......但是有没有 row_to_jsonb()
函数 (!)。 (为什么基本参数里没有orthogonal instruction set?)
The guide 只说 “to_jsonb 函数提供了很多相同的功能”。 我们在哪里可以查看“多少”?还有其他具体的JSONB指南关于这个细节?
((2022 年更新和 pg 升级))
短语 “提供大致相同的功能” 已在版本 13 中删除。current Guide 既不使用短语也不使用“很多”一词。
现在 row_to_json
是 to_json
的别名,除非可选的布尔参数是 true
— 结果将包含jsonb_pretty()
.
中的换行符
现在函数 to_jsonb
和 to_json
是正交的 (!),典型用法是相同的:
SELECT t.a, t.b, to_jsonb(r) json_info
-- or to_json(r)
FROM t, LATERAL (SELECT t.c,t.d,t.f) r;
-- or SELECT to_jsonb(r) FROM (SELECT c,d,f FROM t) r;
你可以将 json 转换为 jsonb row_to_json(...)::jsonb,虽然不理想但通常可以解决问题
您可以使用 to_jsonb
作为 drop-in 替代 row_to_json
。
SELECT to_jsonb(rows) FROM (SELECT * FROM table) rows;
您可以只使用 to_jsonb()
而不是 row_to_json()
,例如:
with the_table(a, b, c) as (
select 1, 'alfa', '2016-01-01'::date
)
select to_jsonb(t), row_to_json(t)
from the_table t;
to_jsonb | row_to_json
------------------------------------------+-------------------------------------
{"a": 1, "b": "alfa", "c": "2016-01-01"} | {"a":1,"b":"alfa","c":"2016-01-01"}
(1 row)
由于参数的类型(anyelement
与 record
),第一个比另一个有更广泛的应用。例如,您可以使用 to_jsonb()
将 Postgres 数组转换为 json 数组,而使用 row_to_json()
:
则无法做到这一点
select to_jsonb(array['a', 'b', 'c']);
to_jsonb
-----------------
["a", "b", "c"]
(1 row)
如果在 row_to_json()
中使用两个参数,您应该另外使用 jsonb_pretty()
:
with the_table(a, b, c) as (
select 1, 'alfa', '2016-01-01'::date
)
select jsonb_pretty(to_jsonb(t)), row_to_json(t, true)
from the_table t;
jsonb_pretty | row_to_json
-----------------------+--------------------
{ +| {"a":1, +
"a": 1, +| "b":"alfa", +
"b": "alfa", +| "c":"2016-01-01"}
"c": "2016-01-01"+|
} |
(1 row)
我在“JSON 模式”下在 pg9.4 上测试了一些查询,现在我正在检查 pg9.5 是否会带来所有相同的 JSONB 功能......但是有没有 row_to_jsonb()
函数 (!)。 (为什么基本参数里没有orthogonal instruction set?)
The guide 只说 “to_jsonb 函数提供了很多相同的功能”。 我们在哪里可以查看“多少”?还有其他具体的JSONB指南关于这个细节?
((2022 年更新和 pg 升级))
短语 “提供大致相同的功能” 已在版本 13 中删除。current Guide 既不使用短语也不使用“很多”一词。
现在 row_to_json
是 to_json
的别名,除非可选的布尔参数是 true
— 结果将包含jsonb_pretty()
.
现在函数 to_jsonb
和 to_json
是正交的 (!),典型用法是相同的:
SELECT t.a, t.b, to_jsonb(r) json_info
-- or to_json(r)
FROM t, LATERAL (SELECT t.c,t.d,t.f) r;
-- or SELECT to_jsonb(r) FROM (SELECT c,d,f FROM t) r;
你可以将 json 转换为 jsonb row_to_json(...)::jsonb,虽然不理想但通常可以解决问题
您可以使用 to_jsonb
作为 drop-in 替代 row_to_json
。
SELECT to_jsonb(rows) FROM (SELECT * FROM table) rows;
您可以只使用 to_jsonb()
而不是 row_to_json()
,例如:
with the_table(a, b, c) as (
select 1, 'alfa', '2016-01-01'::date
)
select to_jsonb(t), row_to_json(t)
from the_table t;
to_jsonb | row_to_json
------------------------------------------+-------------------------------------
{"a": 1, "b": "alfa", "c": "2016-01-01"} | {"a":1,"b":"alfa","c":"2016-01-01"}
(1 row)
由于参数的类型(anyelement
与 record
),第一个比另一个有更广泛的应用。例如,您可以使用 to_jsonb()
将 Postgres 数组转换为 json 数组,而使用 row_to_json()
:
select to_jsonb(array['a', 'b', 'c']);
to_jsonb
-----------------
["a", "b", "c"]
(1 row)
如果在 row_to_json()
中使用两个参数,您应该另外使用 jsonb_pretty()
:
with the_table(a, b, c) as (
select 1, 'alfa', '2016-01-01'::date
)
select jsonb_pretty(to_jsonb(t)), row_to_json(t, true)
from the_table t;
jsonb_pretty | row_to_json
-----------------------+--------------------
{ +| {"a":1, +
"a": 1, +| "b":"alfa", +
"b": "alfa", +| "c":"2016-01-01"}
"c": "2016-01-01"+|
} |
(1 row)