表crons
有一个名为的 JSON 字段surveys
,其中包含一个 UUID 的 JSON 数组,例如:
[
"65f42c322ea442099612cad251be1dac",
"43788fe207b143dc9eac4da38c036af6"
]
表1(计划):
CREATE TABLE "crons" (
"id" int NOT NULL AUTO_INCREMENT,
"depts" longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_bin,
"surveys" longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_bin,
PRIMARY KEY ("id"),
CONSTRAINT "CONSTRAINT_1" CHECK (((`depts` is null) or json_valid(`depts`))),
CONSTRAINT "CONSTRAINT_2" CHECK (((`surveys` is null) or json_valid(`surveys`))),
CONSTRAINT "crons_chk_1" CHECK (json_valid(`depts`)),
CONSTRAINT "crons_chk_2" CHECK (json_valid(`surveys`))
)
表2(调查):
表surveys
包含survey_uuid
作为 varchar 字符串的字段。
CREATE TABLE "surveys" (
"id" int NOT NULL AUTO_INCREMENT,
"survey_uuid" varchar(32) NOT NULL,
PRIMARY KEY ("id"),
UNIQUE KEY "surveys_survey_uuid_uindex" ("survey_uuid"),
CONSTRAINT "survey_json" CHECK (((`survey_json` is null) or json_valid(`survey_json`)))
)
我需要返回surveys.survey_uuid
(varchar) 包含在crons.surveys
(JSON array)中的所有行
试图:
SELECT *
FROM crons c
JOIN
surveys s
ON (JSON_SEARCH(c.surveys, 'one', s.survey_uuid) IS NOT NULL)
WHERE start_date < NOW()
AND end_date > NOW()
AND JSON_SEARCH(c.depts, 'one', 'sales') IS NOT NULL
注意:MariaDB 将 JSON 存储为长文本,但所有 JSON 函数都有效。我已经验证这JSON_SEARCH(depts, 'one', 'sales') IS NOT NULL
是搜索 JSON 字段数组的有效方法。
在 MariaDB 中你不能做的一件事是,CAST(something AS JSON)
但你可以CAST(jsonfield AS char)