在查询包含对象数组的JSON列时如何转义双引号和括号?
这在我运行时有效...
SELECT boarded, boarded->>"$[0].division.id" AS divisionId FROM onboarder
但这不是...
SELECT boarded, boarded->>"$[*].division.id" AS divisionId FROM onboarder
我认为双箭头使一切逃脱,只买回了价值。这就是我所拥有的...
答案 0 :(得分:2)
->>
运算符不进行任何转义。它将结果仅转换为标量数据类型,例如text
或integer
。相当于执行JSON_UNQUOTE(JSON_EXTRACT(...)):
取消对JSON值的引用,并以utf8mb4字符串的形式返回结果。
通过使用结果集创建一个新表并检查它创建的数据类型,我们可以证明->
和->>
之间的区别。
create table t as SELECT boarded, boarded->"$[*].division.id" AS divisionId FROM onboarder;
show create table t;
CREATE TABLE `t` (
`boarded` json DEFAULT NULL,
`divisionId` json DEFAULT NULL
);
select * from t;
+------------------------------------+--------------+
| boarded | divisionId |
+------------------------------------+--------------+
| [{"division": {"id": "8ac7a..."}}] | ["8ac7a..."] |
+------------------------------------+--------------+
注意divisionId是一个json文档,它是一个数组。
如果我们使用->>
,则会发生以下情况:
create table t as SELECT boarded, boarded->>"$[*].division.id" AS divisionId FROM onboarder;
show create table t;
CREATE TABLE `t` (
`boarded` json DEFAULT NULL,
`divisionId` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_bin
)
select * from t;
+------------------------------------+--------------+
| boarded | divisionId |
+------------------------------------+--------------+
| [{"division": {"id": "8ac7a..."}}] | ["8ac7a..."] |
+------------------------------------+--------------+
没有明显区别,因为方括号仍然存在。但是后者存储为longtext
数据类型。
发表评论:
如何返回divideId作为值,以使其不是数组并加引号?
您在查询中使用了$[*]
,此模式的含义是将数组的所有元素作为数组返回。要获取单个值,您需要查询数组的单个元素,如第一个示例所示:
boarded->>'$[0].division.id'
如果您不使用JSON,而是将数据存储在传统表中,那么它会容易得多,该表在其自己的行中有一个分区,而在其自己的列中有该分区的每个字段。
CREATE TABLE divisions (
division_id VARCHAR(...) PRIMARY KEY,
merchant ...
);
CREATE TABLE merchants (
merchant_id ... PRIMARY KEY,
division_id VARCHAR(...),
FOREIGN KEY (division_id) REFERENCES division(division_id)
);
我看到的有关开发人员如何在MySQL中尝试使用JSON的示例越多,我就越相信这是个坏主意。