我有一个名为Order的表,其中有一个名为line_items的jsonb列类型。line_items列可以包含以下嵌套值:
[
{
"id":9994857545813,
"sku":"CLIPPING-PATH_C2_24H",
},
{
"id":9994857578581,
"sku":"NATURAL-SHADOW_C1_24H",
}
]上面的示例中有两个行项,但它可以从1到任意数量的行项不等。
我需要查询所有只包含1行项的订单,其中sku =一个特定的值,如上面的示例所示的CLIPPING-PATH_C2_24H。
因此,查询不应该与上面的示例匹配,但是下面的示例只有一行项和sku=CLIPPING_C2_24H
[
{
"id":9994857545813,
"sku":"CLIPPING-PATH_C2_24H",
}
]使用Rails活动记录编写查询有任何帮助吗?
发布于 2022-05-24 07:47:12
您可以在ruby(如何从rails调用plpgsql函数?)中调用plpghsql。
sql查询:select jsonb_path_query(order_json,'$[*] ? (@.sku == "CLIPPING-PATH_C2_24H")') from orders ;
要正确处理它并不容易,因为PL/pgsql函数字符串的某些部分甚至包括4个单引号。最好用提神通知一步一步地测试。
CREATE OR REPLACE FUNCTION get_sku_CLIPPING_path (_sku text)
RETURNS json
AS $$
DECLARE
_sql text;
_returnjson jsonb;
BEGIN
RAISE NOTICE '%: _sku', $1;
RAISE NOTICE '%', '$[*] ? (@.sku == ' || $1 || ')';
RAISE NOTICE '%', $s$
SELECT
jsonb_path_query(order_json, $s$ || '''' || '$[*] ? (@.sku == ' || $1 || ')''' || ' from orders';
_sql := $s$
SELECT
jsonb_path_query(order_json, $s$ || '''' || '$[*] ? (@.sku == ' || $1 || ')''' || ' )from orders';
EXECUTE _sql
USING _sku INTO _returnjson;
RETURN (_returnjson::json);
END
$$
LANGUAGE plpgsql;叫它:select * from get_sku_CLIPPING_path('"CLIPPING-PATH_C2_24H"');
发布于 2022-05-25 08:13:33
我能够使用jsonb_array_length方法找出这一点:
Order
.where("line_items @> ?", [{sku: sku}].to_json)
.where("jsonb_array_length(line_items) = 1")
.count
end以下资源非常有用:https://gist.github.com/mankind/1802dbb64fc24be33d434d593afd6221
https://stackoverflow.com/questions/72357820
复制相似问题