我正在开发一个 Android 应用程序并使用 Room db 来存储和获取数据,我需要从多个表中获取一些数据,其中结果列之一必须包含 kv 列表的列表 通过以下查询在带有 mysql 的 php 服务器上实现了相同的要求
SELECT
t1.* ,
JSON_MERGE_PATCH(
JSON_OBJECTAGG(
IFNULL(stu.id, '-1'),
IFNULL(stu.color, -1)
),
JSON_OBJECTAGG(
IFNULL(CASE t5.toOrder WHEN 1 THEN 5 WHEN 0 THEN 6 ELSE -1 END, '-1'),
IFNULL((SELECT color FROM `Table4` WHERE id = CASE t5.toOrder WHEN 1 THEN 5 WHEN 0 THEN 6 ELSE -1 END), -1)
)
)
AS status
FROM ((((Table1 AS t1
LEFT JOIN `Table2` AS t2 ON t2.itemId = t1.id)
LEFT JOIN `Table3` AS t3 ON t3.id = t2.orderId)
LEFT JOIN `Table4` AS stu ON t3.statusId = stu.id)
LEFT JOIN `Table5` AS t5 ON t1.id = t5.itemId)
GROUP BY t1.id ORDER BY t1.`name`
工作得很好,我可以像这样以 json 形式获取该列
{ “1”:-2659, “5”:-749647, “-1”:-1 }
现在我正在尝试在 Room db sqlite 中实现相同的查询,但没有运气
这是我尝试过的 (在桌面数据库浏览器上工作正常,但在 Room db 上不行)
SELECT
t1.*,
json_patch(
json_group_object(
CAST(IFNULL(t4.id, '-1') as TEXT),
IFNULL(t4.color, -1)
),
json_group_object(
CAST(IFNULL(CASE t5.toOrder WHEN 1 THEN 5 WHEN 0 THEN 6 ELSE -1 END, '-1') as TEXT),
IFNULL((SELECT color FROM `Status` WHERE id = CASE t5.toOrder WHEN 1 THEN 5 WHEN 0 THEN 6 ELSE -1 END), -1)
)
)
AS status
FROM Tble1 AS t1
LEFT JOIN `Table2` AS t2 ON t2.itemId = t1.id
LEFT JOIN `Table3` AS t3 ON t3.id = t2.orderId
LEFT JOIN `Table4` AS t4 ON t3.statusId = t4.id
LEFT JOIN `Table5` AS t5 ON t1.id = t5.itemId
GROUP BY t1.id ORDER BY t1.`name`
我知道 json1 扩展,但即使使用 requery 库后,状态字段仍然为空 有人可以帮忙吗
除非您使用的是 Android 版本 34 或更高版本,否则 JSON 函数不包含在 SQLite 版本中。
按照:-
自 SQLite 版本 3.38.0 (2022-02-22) 起,JSON 函数和运算符默认内置于 SQLite 中。可以通过添加 -DSQLITE_OMIT_JSON 编译时选项来省略它们。在版本 3.38.0 之前,JSON 函数是一个扩展,只有在包含 -DSQLITE_ENABLE_JSON1 编译时选项时才会包含在构建中。换句话说,JSON 函数从在 SQLite 版本 3.37.2 及更早版本中选择加入变为在 SQLite 版本 3.38.0 及更高版本中选择退出。
参考文献
和