Postgres jsonb_array_elements
Postgres jsonb_array_elements
我有一个 table 和下一个 jsonb 字段 -
{ "auth": [{"roles": ["role1", "role2"]}]}
当我执行此查询时 -
select jsonb_array_elements(role) as role from (
select x -> 'roles' as role
from test,
jsonb_array_elements(data->'auth') x
输出格式为
role
----
"role1"
"role2"
目前的问题是,如果我尝试添加它不起作用的地方
x.role = '"role1"'
,但这个确实有效 x.role like '%"role1"%'
谢谢
可以使用 ->> 运算符将“角色”字段恢复为文本数据。
create table test (data jsonb);
insert into test values('{ "auth": [{"roles": ["role1", "role2"]}]}');
with cte as (
select jsonb_array_elements(role) ->> 0 as role from
(
select x -> 'roles' as role
from test, jsonb_array_elements(data->'auth') x) y)
select role from cte where role = 'role1';
问题是 jsonb_array_elements
returns 结果为 jsonb
,将其与字符串文字进行比较会遇到麻烦。
使用 jsonb_array_elements_text
而不是第一个 jsonb_array_elements
调用,那么结果将是 text
类型,这应该不会给您带来麻烦。
我有一个 table 和下一个 jsonb 字段 -
{ "auth": [{"roles": ["role1", "role2"]}]}
当我执行此查询时 -
select jsonb_array_elements(role) as role from (
select x -> 'roles' as role
from test,
jsonb_array_elements(data->'auth') x
输出格式为
role
----
"role1"
"role2"
目前的问题是,如果我尝试添加它不起作用的地方
x.role = '"role1"'
,但这个确实有效 x.role like '%"role1"%'
谢谢
可以使用 ->> 运算符将“角色”字段恢复为文本数据。
create table test (data jsonb);
insert into test values('{ "auth": [{"roles": ["role1", "role2"]}]}');
with cte as (
select jsonb_array_elements(role) ->> 0 as role from
(
select x -> 'roles' as role
from test, jsonb_array_elements(data->'auth') x) y)
select role from cte where role = 'role1';
问题是 jsonb_array_elements
returns 结果为 jsonb
,将其与字符串文字进行比较会遇到麻烦。
使用 jsonb_array_elements_text
而不是第一个 jsonb_array_elements
调用,那么结果将是 text
类型,这应该不会给您带来麻烦。