获取一列中的所有 jsonb 值以供在 to_tsvector 中使用
Get all jsonb values in one column for usage in to_tsvector
我得到了一个 table jsonb table t_1
,其中包含 jsonb 类型的列 column_1
,我需要将其转换为 table 字符串,这是 jsonb 值的连接
这是一个脚本
CREATE TABLE t_1 (
ID serial NOT NULL PRIMARY KEY,
column_1 jsonb NOT NULL
);
INSERT INTO t_1 (column_1)
VALUES
(
'{ "01": "Lily Bush", "03": "prod2uct"}'
),
(
'{ "41": "Josh William", "12": "product7"}'
),
(
'{ "07": "Mary Clark", "items" : "product2"}'
);
我试过这个:
SELECT distinct jsonb_array_elements_text(column_1 -> jsonb_object_keys(column_1)) AS Actor FROM t_1
但是这个return'unable to extract elements from scalar'
我试过这个:
SELECT tiket, string_agg(column_2, ', ') as list FROM(
SELECT column_1 ->> jsonb_object_keys(column_1) as column_2, id as tiket FROM t_1 ) as foo1
GROUP BY tiket
但这里是内部 select
如何在没有内部 select 的情况下获取一列中的所有 jsonb 值,类似于第一个查询?
我需要它在 to_tsvector
中使用
我需要在
中使用它
setweight(
to_tsvector('simple', column_with_json::text),
'A'
)
但是column_with_json::text
不是我需要的,我需要获取值,没有键
有例子吗?
在横向连接中使用 jsonb_each_text()
:
SELECT id, string_agg(value, ', ') AS list
FROM t_1
CROSS JOIN jsonb_each_text(column_1)
GROUP BY id
id | list
----+------------------------
1 | Lily Bush, prod2uct
2 | product7, Josh William
3 | Mary Clark, product2
(3 rows)
如果要在条件中使用结果聚合值,请使用 HAVING
子句,例如:
SELECT id, string_agg(value, ', ') AS list
FROM t_1
CROSS JOIN jsonb_each_text(column_1)
GROUP BY id
HAVING string_agg(value, ', ') LIKE '%Lily%'
或包装器查询中的派生 table 和 WHERE
子句:
SELECT *
FROM (
SELECT id, string_agg(value, ', ') AS list
FROM t_1
CROSS JOIN jsonb_each_text(column_1)
GROUP BY id
) s
WHERE list LIKE '%Lily%'
这两种方法基本上是等效的,在典型情况下它们生成相同的查询计划。在两者中,聚合只计算一次。
我得到了一个 table jsonb table t_1
,其中包含 jsonb 类型的列 column_1
,我需要将其转换为 table 字符串,这是 jsonb 值的连接
这是一个脚本
CREATE TABLE t_1 (
ID serial NOT NULL PRIMARY KEY,
column_1 jsonb NOT NULL
);
INSERT INTO t_1 (column_1)
VALUES
(
'{ "01": "Lily Bush", "03": "prod2uct"}'
),
(
'{ "41": "Josh William", "12": "product7"}'
),
(
'{ "07": "Mary Clark", "items" : "product2"}'
);
我试过这个:
SELECT distinct jsonb_array_elements_text(column_1 -> jsonb_object_keys(column_1)) AS Actor FROM t_1
但是这个return'unable to extract elements from scalar'
我试过这个:
SELECT tiket, string_agg(column_2, ', ') as list FROM(
SELECT column_1 ->> jsonb_object_keys(column_1) as column_2, id as tiket FROM t_1 ) as foo1
GROUP BY tiket
但这里是内部 select
如何在没有内部 select 的情况下获取一列中的所有 jsonb 值,类似于第一个查询?
我需要它在 to_tsvector
我需要在
中使用它setweight(
to_tsvector('simple', column_with_json::text),
'A'
)
但是column_with_json::text
不是我需要的,我需要获取值,没有键
有例子吗?
在横向连接中使用 jsonb_each_text()
:
SELECT id, string_agg(value, ', ') AS list
FROM t_1
CROSS JOIN jsonb_each_text(column_1)
GROUP BY id
id | list
----+------------------------
1 | Lily Bush, prod2uct
2 | product7, Josh William
3 | Mary Clark, product2
(3 rows)
如果要在条件中使用结果聚合值,请使用 HAVING
子句,例如:
SELECT id, string_agg(value, ', ') AS list
FROM t_1
CROSS JOIN jsonb_each_text(column_1)
GROUP BY id
HAVING string_agg(value, ', ') LIKE '%Lily%'
或包装器查询中的派生 table 和 WHERE
子句:
SELECT *
FROM (
SELECT id, string_agg(value, ', ') AS list
FROM t_1
CROSS JOIN jsonb_each_text(column_1)
GROUP BY id
) s
WHERE list LIKE '%Lily%'
这两种方法基本上是等效的,在典型情况下它们生成相同的查询计划。在两者中,聚合只计算一次。