【问题标题】:How to query row containing the given element inside a json column Laravel Postgres如何在 json 列 Laravel Postgres 中查询包含给定元素的行
【发布时间】:2018-07-23 00:46:29
【问题描述】:

大家好,我有一个 postgresql 表,其中有一个名为 agent 的 json 列。见下文

SELECT agents FROM cnms_rosters;

结果

      agents      
------------------
 [1,13,3,16,15]
 [12,13,14,15,15]
 [11,73,55,16,44]
(3 rows)

此列包含代理的 ID。我想要做的是查询具有特定代理 ID 的行。

我怎样才能做到这一点?

我目前正在使用 Laravel 框架,在查询数据方面有什么雄辩的方法吗?如果不是如何使用 DB::raw 或其他查询生成器查询它。

【问题讨论】:

    标签: php json postgresql laravel-5 laravel-5.3


    【解决方案1】:

    您可以使用模型中的正则表达式搜索:

    CnmsRoster::where('agents', '~', "/[^0-9]{$agent_id}[^0-9]/")
    

    [^0-9] 旨在匹配方括号或逗号。这使您可以在字符串内部查找要夹在控制字符之间的数字代理 ID。

    【讨论】:

    • 谢谢我去试试
    【解决方案2】:

    sql 查询将使用@> 运算符,例如:

    t=# with cnms_rosters(agents) as (values('[1,13,3,16,15]'::jsonb),('[12,13,14,15,15]'),('[11,73,55,16,44]'))
    select agents FROM cnms_rosters where agents @> '[13]'::jsonb;
            agents
    ----------------------
     [1, 13, 3, 16, 15]
     [12, 13, 14, 15, 15]
    (2 rows)
    

    t=# with cnms_rosters(agents) as (values('[1,13,3,16,15]'::jsonb),('[12,13,14,15,15]'),('[11,73,55,16,44]'))
    select agents FROM cnms_rosters where agents @> '[16]'::jsonb;
            agents
    ----------------------
     [1, 13, 3, 16, 15]
     [11, 73, 55, 16, 44]
    (2 rows)
    

    和数组一样:

    t=# with cnms_rosters(agents) as (values(array[1,13,3,16,15]),(array[12,13,14,15,15]),(array[11,73,55,16,44]))
    select agents FROM cnms_rosters where agents @> array[13];
          agents
    ------------------
     {1,13,3,16,15}
     {12,13,14,15,15}
    (2 rows)
    

    t=# with cnms_rosters(agents) as (values(array[1,13,3,16,15]),(array[12,13,14,15,15]),(array[11,73,55,16,44]))
    select agents FROM cnms_rosters where agents @> array[16];
          agents
    ------------------
     {1,13,3,16,15}
     {11,73,55,16,44}
    (2 rows)
    

    【讨论】:

    • 谢谢,我去试试
    猜你喜欢
    • 1970-01-01
    • 2017-01-21
    • 2022-09-23
    • 2018-08-08
    • 2015-06-14
    • 2020-01-30
    • 2012-11-26
    • 1970-01-01
    相关资源
    最近更新 更多