Sql 如何选择与json字段数组中的值匹配的记录?

Sql 如何选择与json字段数组中的值匹配的记录?,sql,arrays,json,postgresql,Sql,Arrays,Json,Postgresql,我试图返回与数组元素匹配的记录,该数组元素等于json字段中的特定值 我发现这与我的问题很接近。然而,我认为关键的区别在于我使用json而不是jsonb。出于各种原因,我现在需要使用json。当我尝试其他帖子中的步骤时,我得到了与下面相同的错误 我有这个示例数据 我正在尝试运行此查询: SELECT data FROM tests.results where (data->>'scores') @> '[72]'; 我希望从结果中得到两行: {"name": "Kurt",

我试图返回与数组元素匹配的记录,该数组元素等于json字段中的特定值

我发现这与我的问题很接近。然而,我认为关键的区别在于我使用json而不是jsonb。出于各种原因,我现在需要使用json。当我尝试其他帖子中的步骤时,我得到了与下面相同的错误

我有这个示例数据

我正在尝试运行此查询:

SELECT data
FROM tests.results
where (data->>'scores') @> '[72]';
我希望从结果中得到两行:

{"name": "Kurt", "scores": [69, 71, 72, 67, 68]}
{"name": "Libby", "scores": [72, 73, 74, 75]}
但我得到:

SQL Error [42883]: ERROR: operator does not exist: text @> integer
  Hint: No operator matches the given name and argument type(s). 
  You might need to add explicit type casts.
我目前正在使用Postgres 10,但可能会升级到12。非常感谢您的帮助。

您需要使用->而不是->>。前者返回一个json对象,而后者返回文本;同时,@>操作符对json对象而不是文本进行操作

SELECT data
FROM tests.results
where (data->'scores')::jsonb @> '[72]';
:


我看到的文档中说@>是一个只支持jsonb的操作员-这行吗?他可能需要对字符串值进行查找。@Hogan:啊,好吧,我知道了,我相应地更新了答案并添加了一个提琴。就是这样!谢谢各位。将->>更改为->并在我的where子句中添加::jsonb完成了此操作。感谢您的快速转变。
SELECT data
FROM tests.results
where (data->'scores')::jsonb @> '[72]';
WITH results AS (
    SELECT '{"name": "Bob", "scores": [64, 66]}'::json mydata
    UNION ALL SELECT '{"name": "Sally", "scores": [66, 65]}'::json
    UNION ALL SELECT '{"name": "Kurt", "scores": [69, 71, 72, 67, 68]}'::json
    UNION ALL SELECT '{"name": "Libby", "scores": [72, 73, 74, 75]}'::json
    UNION ALL SELECT '{"name": "Frank", "scores": [80, 81, 82, 83]}'::json
)
SELECT mydata::text
FROM results
where (mydata->'scores')::jsonb @> '[72]';

| mydata                                           |
| ------------------------------------------------ |
| {"name": "Kurt", "scores": [69, 71, 72, 67, 68]} |
| {"name": "Libby", "scores": [72, 73, 74, 75]}    |