检查 JSON 数组中是否存在值
Checking existence of value inside JSON array
我找到了比这更复杂的解决方案,但我无法完成这项工作...
我有一个名为 data 的列,类型为 json。 JSON结构如下:
{"actions": ["action1","action2","action3", ..., "actionN"]}
所以,假设我有 3 行数据如下:
{"actions": ["work","run"]}
{"actions": ["run","eat","sleep", 'walk']}
{"actions": ["eat","run","work"]}
我想检索 work 包含在 actions 数组中的行。
我已经尝试过类似于此处发布的内容:
Query for element of array in JSON column,但由于数组中的每个元素只是一个 json 字符串,我被困在那里了。
然后,我尝试了类似的方法:
SELECT * from table t WHERE 'work' in ...
但这也无法将值作为字符串数组放置在那里。
使用 PostgreSql 9.3。
由于您使用的是 json
类型,它在内部只是一个字符串,最简单的解决方案是:
SELECT * FROM table WHERE strpos(data::text, 'work') > 0;
它首先违背了使用 json
的目的,但在这种简单的情况下,它(很可能)比 json 解析器更快。
一个json的解决方案是:
SELECT * FROM (
SELECT *, unnest(data->"actions")::text AS action FROM table) AS foo
WHERE action = 'work';
我找到了比这更复杂的解决方案,但我无法完成这项工作...
我有一个名为 data 的列,类型为 json。 JSON结构如下:
{"actions": ["action1","action2","action3", ..., "actionN"]}
所以,假设我有 3 行数据如下:
{"actions": ["work","run"]}
{"actions": ["run","eat","sleep", 'walk']}
{"actions": ["eat","run","work"]}
我想检索 work 包含在 actions 数组中的行。
我已经尝试过类似于此处发布的内容: Query for element of array in JSON column,但由于数组中的每个元素只是一个 json 字符串,我被困在那里了。
然后,我尝试了类似的方法:
SELECT * from table t WHERE 'work' in ...
但这也无法将值作为字符串数组放置在那里。
使用 PostgreSql 9.3。
由于您使用的是 json
类型,它在内部只是一个字符串,最简单的解决方案是:
SELECT * FROM table WHERE strpos(data::text, 'work') > 0;
它首先违背了使用 json
的目的,但在这种简单的情况下,它(很可能)比 json 解析器更快。
一个json的解决方案是:
SELECT * FROM (
SELECT *, unnest(data->"actions")::text AS action FROM table) AS foo
WHERE action = 'work';