MySQL-查询JSON列时转义双引号和方括号

时间:2019-04-05 17:36:02

标签: mysql json

在查询包含对象数组的JSON列时如何转义双引号和括号?

这在我运行时有效...

SELECT boarded, boarded->>"$[0].division.id" AS divisionId FROM onboarder

但这不是...

SELECT boarded, boarded->>"$[*].division.id" AS divisionId FROM onboarder

我认为双箭头使一切逃脱,只买回了价值。这就是我所拥有的...

enter image description here

1 个答案:

答案 0 :(得分:2)

->>运算符不进行任何转义。它将结果仅转换为标量数据类型,例如textinteger。相当于执行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的示例越多,我就越相信这是个坏主意。