- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在 MySQL 8 中,我们现在可以使用 JSON 类型的列,也可以使用内置函数,如 JSON_TABLE() 但由于我在不同的场景中使用,有时我会看到我没想到的结果。
Docs for JSON_TABLE() : https://dev.mysql.com/doc/refman/8.0/en/json-table-functions.html
Docs for JSON search functions: https://dev.mysql.com/doc/refman/8.0/en/json-search-functions.html
CREATE TABLE USER (
NAME varchar(128) NOT NULL,
METADATA JSON NULL
);
INSERT INTO USER VALUES
('John', '[1,3]'),
('Jane', '[2]'),
('Bob', null),
('Sally', '[9]');
CREATE TABLE ROLES (
ID int NOT NULL,
NAME varchar(64) NOT NULL
);
INSERT INTO ROLES VALUES
(1, 'Originator'),
(2, 'Approver'),
(3, 'Reviewer');
SELECT *
FROM USER,
JSON_TABLE(
USER.METADATA, "$[*]"
COLUMNS(ID int PATH "$" NULL ON ERROR NULL ON EMPTY)
) AS JSON_ROLE_LINK;
## Results ##
| NAME | METADATA | ID |
| ----- | -------- | --- |
| John | [1, 3] | 1 |
| John | [1, 3] | 3 |
| Jane | [2] | 2 |
| Sally | [9] | 9 |
SELECT * FROM ROLES;
## Results ##
| ID | NAME |
| --- | ---------- |
| 1 | Originator |
| 2 | Approver |
| 3 | Reviewer |
SELECT *
FROM USER
JOIN ROLES ON ROLES.id IN (
SELECT ID FROM JSON_TABLE(
USER.METADATA, "$[*]"
COLUMNS(ID int PATH "$" NULL ON ERROR NULL ON EMPTY)
) AS JSON_ROLE_LINK
);
##There are no results to be displayed.
SELECT *
FROM USER,
JSON_TABLE(
USER.METADATA, "$[*]"
COLUMNS(ID int PATH "$" NULL ON ERROR NULL ON EMPTY)
) AS JSON_ROLE_LINK
JOIN ROLES ON ROLES.ID = JSON_ROLE_LINK.ID;
## Results ##
| NAME | METADATA | ID | ID | NAME |
| ---- | -------- | --- | --- | ---------- |
| John | [1, 3] | 1 | 1 | Originator |
| John | [1, 3] | 3 | 3 | Reviewer |
| Jane | [2] | 2 | 2 | Approver |
SELECT *
FROM USER,
JSON_TABLE(
USER.METADATA, "$[*]"
COLUMNS(ID int PATH "$" NULL ON ERROR NULL ON EMPTY)
) AS JSON_ROLE_LINK
LEFT JOIN ROLES ON ROLES.ID = JSON_ROLE_LINK.ID;
## Results ##
| NAME | METADATA | ID | ID | NAME |
| ----- | -------- | --- | --- | ---------- |
| John | [1, 3] | 1 | 1 | Originator |
| Jane | [2] | 2 | 2 | Approver |
| John | [1, 3] | 3 | 3 | Reviewer |
| Sally | [9] | 9 | | |
SELECT *
FROM USER
LEFT JOIN ROLES ON ROLES.id IN (
SELECT ID FROM JSON_TABLE(
USER.METADATA, "$[*]"
COLUMNS(ID int PATH "$" NULL ON ERROR NULL ON EMPTY)
) AS JSON_ROLE_LINK
);
## Results ##
| NAME | METADATA | ID | NAME |
| ----- | -------- | --- | ---------- |
| John | [1, 3] | 1 | Originator |
| John | [1, 3] | 3 | Reviewer |
| Jane | [2] | 2 | Approver |
| Bob | | | |
| Sally | [9] | | |
最佳答案
使用 ISNULL
创建虚拟对象的属性 json
SELECT *
FROM USER,
JSON_TABLE(
IFNULL(USER.METADATA,'[0]'), "$[*]"
COLUMNS(ID int PATH "$" NULL ON ERROR NULL ON EMPTY)
) AS JSON_ROLE_LINK;
#1 No JOINS with JSON_TABLE where is Bob?
SELECT *
FROM USER,
JSON_TABLE(
IFNULL(USER.METADATA,'[0]'), "$[*]"
COLUMNS(ID int PATH "$" NULL ON ERROR NULL ON EMPTY)
) AS JSON_ROLE_LINK;
#2 Verify our ROLE recrods exist
SELECT * FROM ROLES;
#3 Regular JOIN with JSON_TABLE inside the IN(), why are there no results?
SELECT *
FROM USER
JOIN ROLES ON ROLES.id IN (
SELECT ID FROM USER, JSON_TABLE(
USER.METADATA, "$[*]"
COLUMNS(ID int PATH "$" NULL ON ERROR NULL ON EMPTY)
) AS JSON_ROLE_LINK
);
#4 Regular JOIN with JSON_TABLE, returns expected results
SELECT *
FROM USER,
JSON_TABLE(
IFNULL(USER.METADATA,'[0]'), "$[*]"
COLUMNS(ID int PATH "$" NULL ON ERROR NULL ON EMPTY)
) AS JSON_ROLE_LINK
JOIN ROLES ON ROLES.ID = JSON_ROLE_LINK.ID;
#5 LEFT JOIN with JSON_TABLE, where is Bob?
SELECT *
FROM USER,
JSON_TABLE(
IFNULL(USER.METADATA,'[0]'), "$[*]"
COLUMNS(ID int PATH "$" NULL ON ERROR NULL ON EMPTY)
) AS JSON_ROLE_LINK
LEFT JOIN ROLES ON ROLES.ID = JSON_ROLE_LINK.ID;
#6 LEFT JOIN with JSON_TABLE inside the IN(), returns expected results
SELECT *
FROM USER
LEFT JOIN ROLES ON ROLES.id IN (
SELECT ID FROM JSON_TABLE(
IFNULL(USER.METADATA,'[0]'), "$[*]"
COLUMNS(ID int PATH "$" NULL ON ERROR NULL ON EMPTY)
) AS JSON_ROLE_LINK
);
关于json - 为什么 JSON_TABLE() 加入不一致?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58700849/
我有一个类似以下结构的表格: | id | data | | 1 | {"products":[1,2,3]} | | 2 | {"products":[2,5,7
在 MySQL 8 中,我们现在可以使用 JSON 类型的列,也可以使用内置函数,如 JSON_TABLE() 但由于我在不同的场景中使用,有时我会看到我没想到的结果。 Docs for JSON_T
我正在使用 JSON 表,但遇到了问题。我收到以下错误: 错误代码:1210。JSON_TABLE 的参数不正确 我在 AWS 上通过 MySQL Workbench 使用 MySQL 引擎版本 8.
我想将名为 words 的数据库表中名为 data_table 的 json 列转换为表。栏目内容为: {"123456":{"first":"hello","second":"there"}, "
我有一个 MySQL 8.0.22 JSON 列,其中包含具有事先不知道的键的对象: '{"x": 1, "y": 2, "z": 3}' '{"e": 4, "k": 5}' 我想使用 JSON_T
我正在尝试使用 JSON_TABLE 解析 JSON。 Oracle 数据库版本 12.1.0.2 { "Rownum": "1", "Name": "John", "AddressArray"
我在谷歌上搜索了很多,似乎无法找到一个简单的解决方案来解决我的简单用例。 我在 Oracle 12C 数据库中有一个 json 列(当然实际上是一个带有 json 约束的 varchar),并且在该列
我需要取消嵌套存储为 JSON 文档一部分的大型数组。 在 Oracle 和 MYSQL 中,我可以为此使用 JSON_TABLE 在 SQL Server 中我可以使用 OPENJSON 在 Pos
我实际上想使用 JSON_TABLE 结构查询存储在 Oracle 数据库中的 JSON 字符串。这非常有效。 SQL 查询 SELECT f.val from JSON, JSON_TAB
这是我面临的问题的最低工作版本。正在关注the JSON table example在文档页面上,我在 MySQL 8 中有下表 test,其中 id 是一个 INT 字段,data 是一个 JSON
这是我面临的问题的最低工作版本。正在关注the JSON table example在文档页面上,我在 MySQL 8 中有下表 test,其中 id 是一个 INT 字段,data 是一个 JSON
我是一名优秀的程序员,十分优秀!