大家好,我有一个postgresql表,其中有一个名为agents的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 Framework是否有任何雄辩的方法来查询数据?如果不是如何使用DB :: raw或其他查询构建器查询它。
答案 0 :(得分:0)
您可以使用模型中的正则表达式搜索:
CnmsRoster::where('agents', '~', "/[^0-9]{$agent_id}[^0-9]/")
[^0-9]
旨在匹配方括号或逗号。这使您可以在字符串中查找想要夹在控制字符之间的数字代理ID。
答案 1 :(得分:0)
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)