【问题标题】:Query Json field on postgresql在 postgresql 上查询 Json 字段
【发布时间】:2021-07-04 03:05:17
【问题描述】:

我的数据库 pgsql 上有一个 json 列

我需要使用 localId 搜索键, 我尝试了这两个查询:

SELECT *
FROM public.translations
    where datas->>'localId' = 7;

 SELECT *
    FROM public.translations
        where datas->>'localId'::text = '7';

没有结果。

请问我该怎么做?

当我进行此查询时,我没有任何值

SELECT datas->>'localId' as local
FROM public.translations 
SELECT datas::json->>'localId' as local
FROM public.translations 

【问题讨论】:

  • 样本数据最好显示为formatted text。请参阅here,了解有关如何创建漂亮表格的一些提示。

标签: sql json postgresql


【解决方案1】:

你需要的是::json,紧跟在datas之后:

SELECT *
FROM public.translations
where datas::json->>'localId' = '7';

Related question on StackOverFlow

如果您需要更多信息,请点击此处 Newest Postgresql Documentation

【讨论】:

    【解决方案2】:

    您需要将两个值都转换为相同的类型

    where datas->>'localId' = '7'::text;
    

    where (datas->>'localId')::integer = 7;
    

    或者你应该为你的例子添加括号

    where (datas->>'localId')::text = '7';
    

    【讨论】:

    • '7'::text 可以简化为 '7'(datas->>'localId')::text 可以简化为 datas->>'localId' - ->> 运算符已经返回 text
    • 我尝试过的一样 (datas->>'localId')::integer = 7;但没有结果
    【解决方案3】:

    您的屏幕截图有点难以阅读,但您的 JSON 似乎实际上是一个 JSON 数组,因此您需要从那里选择第一个元素:

    where (datas -> 0 ->> 'localId')::int = 7
    

    或者更短一点:

    where (datas #>> '{0,localId}')::int = 7
    

    您也可以使用包含运算符@> 来检查是否至少有一个元素带有localId = 7。但是@> 运算符需要jsonb,而不是json,因此您需要转换列

    where datas::jsonb @> '[{"localId": 7}]'
    

    Online example

    【讨论】:

    • 谢谢,当我在数组中只有一个元素时没关系,但是当我有 2 个元素并且第二个元素的值为 7 时,它不会被获取
    • @user1428798:@> 会这样做
    • @ a_horse_with_no_name 当我尝试它时出现此错误:“错误:运算符不存在:json @> 未知 LINE 1: SELECT * FROM public.translations WHERE datas @> '[{"localI. .. ^ 提示:没有运算符匹配给定的名称和参数类型。您可能需要添加显式类型转换。 SQL 状态:42883 字符:48"
    • @user1428798:我忽略了您使用的是json 列,而不是推荐的jsonb。看我的编辑,你必须投专栏
    • 非常感谢,现在可以了!
    猜你喜欢
    • 1970-01-01
    • 2015-04-27
    • 2021-06-28
    • 1970-01-01
    • 1970-01-01
    • 2020-03-04
    • 2017-06-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多