检查 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';