我在名为from. 它看起来像这样。
['2016-05-01', '2016-05-03', '2016-05-04']
Run Code Online (Sandbox Code Playgroud)
我想选择最后一个项目(这里2016-05-04)。
我试过这个:
SELECT `from`->"$[JSON_LENGTH(`from`) - 1]" FROM `table` WHERE `id` = 3;
Run Code Online (Sandbox Code Playgroud)
但得到了那个错误:
ERROR 3143 (42000): Invalid JSON path expression. The error is around character position 2.
Run Code Online (Sandbox Code Playgroud)
我试过使用这样的变量:
SET @count = (SELECT JSON_LENGTH(`from`) - 1 FROM `table` WHERE `id` = 3);
SELECT `from`->"$[@count]" FROM `table` WHERE `id` = 3;
Run Code Online (Sandbox Code Playgroud)
但得到了完全相同的错误。但如果我这样做:
SELECT `from`->"$[2]" FROM `table` WHERE `idx` = 3;
Run Code Online (Sandbox Code Playgroud)
它工作正常。
我正在使用 MySQL 5.7.19
我正在尝试检索一个如下所示的类
class Task
{
public $title;
public $done;
}
Run Code Online (Sandbox Code Playgroud)
和属性保存在 JSON 列中title。done
我用来检索的代码如下所示:
$tasksSql = <<<'EOT'
SELECT JSON_UNQUOTE(JSON_EXTRACT(data, '$.title')) AS title,
JSON_EXTRACT(data, '$.done') AS done
FROM Tasks WHERE TaskListId = ?;
EOT;
$tasksStatement = $connection->prepare($tasksSql);
$tasksStatement->execute([$id]);
$tasksStatement->setFetchMode(PDO::FETCH_CLASS, "Task");
$taskList->tasks = $tasksStatement->fetchAll(PDO::FETCH_CLASS, "Task");
Run Code Online (Sandbox Code Playgroud)
它填充了所有字段,但done属性设置为字符串值“true”或“false”而不是布尔值。
我有一个 json,我想提取一个键的值。我知道钥匙名称,但不知道位置。我的 json 很复杂,在 mysql 中看起来像这样:
set @jsonstr:='
{
"glossary": {
"title": "example glossary",
"GlossDiv": {
"title": "S",
"GlossList": {
"GlossEntry": {
"ID": "SGML",
"SortAs": "SGML",
"GlossTerm": "Standard Generalized Markup Language",
"Acronym": "SGML",
"Abbrev": "ISO 8879:1986",
"GlossDef": {
"para": "A meta-markup language, used to create markup languages such as DocBook.",
"GlossSeeAlso": ["GML", "XML"]
},
"GlossSee": "markup"
}
}
}
}
}
';
Run Code Online (Sandbox Code Playgroud)
例如,我想搜索关键字“Acronym”。我想要完整路径/或直接它的值[“SGML”],以便我可以进一步处理它。
我正在执行以下操作,它返回 null
select JSON_Search(@jsonstr,'all', '%Acronym%')
Run Code Online (Sandbox Code Playgroud)
我的要求:
它有效,所以我现在尝试使用更新后的 json,它看起来像 …
我想更新数据库中的 JSON 数组
我有这个数组:
Array
(
[id] => 34
[var1] => val1
[var2] => val2
[var3] => val3
)
Run Code Online (Sandbox Code Playgroud)
我需要通过 id 更新 json
查询样本:
JOSN_SET(`json_arr`,'$."34"','{"id":"34","var1":"val1","var2":"val2","var3":"val3"}')
Run Code Online (Sandbox Code Playgroud)
预期结果 :
{"34":{"id":"34","var1":"val1","var2":"val2","var3":"val3"}}
Run Code Online (Sandbox Code Playgroud)
结果 :
{"34":"{\"id\":\"34\",\"var1\":\"val1\",\"var2\":\"val2\",\"var3\":\"val3\"}"}
Run Code Online (Sandbox Code Playgroud)
谢谢您的帮助。
我正在尝试找到一种方法来搜索 JSON 对象并获取特定的键,但搜索另一个键。
这是一个示例架构:
CREATE TABLE `fields` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`label` varchar(64) COLLATE utf8mb4_unicode_ci NOT NULL,
`options` json DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
INSERT INTO `fields` (label, options) VALUES
(
'My Field',
'[{"text": "Grass", "value": "1"}, {"text": "Synthetic (New Type - Soft)", "value": "2"}, {"text": "Synthetic (Old Type - Hard)", "value": "3"}, {"text": "Gravel", "value": "5"}, {"text": "Clay", "value": "6"}, {"text": "Sand", "value": "7"}, {"text": "Grass/Synthetic Mix", "value": "8"}]'
);
Run Code Online (Sandbox Code Playgroud)
数据库小提琴: …
我的问题是在搜索mysql的JSON数据类型时搜索json数组的内容.
所以,如果我在mysql表中有两行,则调用json字段foo.
第一行有:
{
"items": [
{"type": "bar"}
]
}
Run Code Online (Sandbox Code Playgroud)
第二行有:
{
"items": [
{"type": "baz"}
]
}
Run Code Online (Sandbox Code Playgroud)
我可以跑
select `foo`->"$.items[0].type" from `jsontest`
Run Code Online (Sandbox Code Playgroud)
返回2结果:bar和baz
我可以跑
select `id` from `jsontest` where `foo`->"$.items[0].type" = "bar"
Run Code Online (Sandbox Code Playgroud)
返回1结果:1- 即.第一行的id.
在MySQL的文档状态,您可以使用[*],以"评估在一个JSON阵列中的所有元素的值".
但是,以下查询返回零项:
select `id` from `jsontest` where `foo`->"$.items[*].type" = "bar"
Run Code Online (Sandbox Code Playgroud)
我的查询有什么问题?
我有一个具有以下结构的表:
select * from test_table;
id |load_balancer_name |listener_descriptions |
---|-------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
1 |with_cert_1 |[{"Listener": {"Protocol": "HTTPS", "LoadBalancerPort": 443, "InstanceProtocol": "HTTP", "InstancePort": 9005, "SSLCertificateId": "arn:aws:acm:us-west-2:xxxx:certificate/xxx"}, "PolicyNames": ["xxxx"]}] |
2 |with_cert_1 |[{"Listener": {"Protocol": "HTTPS", "LoadBalancerPort": 443, "InstanceProtocol": "HTTP", "InstancePort": 9005, "SSLCertificateId": "arn:aws:acm:us-west-2:xxxx:certificate/xxx"}, "PolicyNames": ["xxxx"]}] |
3 |with_cert_2 |[{"Listener": {"Protocol": "HTTPS", "LoadBalancerPort": 443, "InstanceProtocol": "HTTP", "InstancePort": 9005, "SSLCertificateId": "arn:aws:acm:us-west-2:xxxx:certificate/yyy"}, "PolicyNames": ["xxxx"]}] |
4 |no_cert | |
Run Code Online (Sandbox Code Playgroud)
我需要的是根据listener_descriptions列进行一些搜索。为了确保JSON_*方法有效,我做了这个查询,效果很好:
select
id, load_balancer_name,
JSON_EXTRACT(listener_descriptions, "$[*].Listener.SSLCertificateId")
from test_table;
id |load_balancer_name |JSON_EXTRACT(listener_descriptions, "$[*].Listener.SSLCertificateId") |
---|-------------------|----------------------------------------------------------------------| …Run Code Online (Sandbox Code Playgroud) JSONmysql 中是否有一个函数会忽略尝试添加元素(如果元素已经存在)?例如:
update waitinglist SET
new = JSON_ARRAY_APPEND(new, '$', "orange")
where id=2;
update waitinglist SET
new = JSON_ARRAY_APPEND(new, '$', "orange")
where id=2;
Run Code Online (Sandbox Code Playgroud)
现在我的数组看起来像:
["apple", "orange", "orange", "orange", "orange"]
Run Code Online (Sandbox Code Playgroud)
但我希望它像一组一样工作,并且只是:
["apple", "orange"]
Run Code Online (Sandbox Code Playgroud)
有没有办法做到这一点?
这是我面临的问题的最低工作版本。按照文档页面上的JSON 表示例,我在 MySQL 8 中进行了下表测试,其中 id 是 INT 字段,data 是 JSON 字段。
id | data
-----------------------------
1 | [{"x": 2, "y": "8"}, {"x": "3", "y": "7"}, {"x": "4", "y": 6}]
Run Code Online (Sandbox Code Playgroud)
我可以使用以下语句成功获取数据(***):
SELECT data->"$[*]" as example FROM test t WHERE id = 1
Run Code Online (Sandbox Code Playgroud)
它返回“示例”列下:
[{“x”:2,“y”:“8”},{“x”:“3”,“y”:“7”},{“x”:“4”,“y”:6} ]
现在我想尝试从返回的数据构造一个 JSON_TABLE 。如果我手动将数据输入到 JSON_TABLE 查询中,即
SELECT * FROM JSON_TABLE(
'[{"x": 2, "y": "8"}, {"x": "3", "y": "7"}, {"x": "4", "y": 6}]',
"$[*]" COLUMNS (
rowID FOR ORDINALITY,
xval VARCHAR(100) PATH "$.x", …Run Code Online (Sandbox Code Playgroud) 从 MySQL JSON 数据字段中,我从数组中提取数据,如下所示:
\nSELECT \ndata ->> \'$.fields[*]\' as fields \nFROM some_database...\nRun Code Online (Sandbox Code Playgroud)\n返回:
\n[{\n"id": 111056, \n"hint": null, \n"slug": "email", \n"label": "E-mail", \n"value": null, \n"field_value": "test@example.com", \n"placeholder": null\n}, {\n"id": 111057, \n"hint": null, \n"slug": "name", \n"label": "Imi\xc4\x99", \n"value": null, \n"field_value": "Aneta", \n"placeholder": null\n}]\nRun Code Online (Sandbox Code Playgroud)\n我还可以提取单列:
\n[{\n"id": 111056, \n"hint": null, \n"slug": "email", \n"label": "E-mail", \n"value": null, \n"field_value": "test@example.com", \n"placeholder": null\n}, {\n"id": 111057, \n"hint": null, \n"slug": "name", \n"label": "Imi\xc4\x99", \n"value": null, \n"field_value": "Aneta", \n"placeholder": null\n}]\nRun Code Online (Sandbox Code Playgroud)\n并返回以下结果:
\n[test@example.com, Aneta]\n …Run Code Online (Sandbox Code Playgroud) 我有一个config要向其中添加键值对的json类型列,最终看起来像:
{
"features": {
"divisions": true,
"utilities": {
"water": true,
"gas": true,
"electric": true
}
}
}
Run Code Online (Sandbox Code Playgroud)
我遇到的问题是,当我想在功能部件中插入实用程序对象时,要么覆盖divisions键值,要么返回NULL并且utilities没有插入对象。
此外,该config列可以是NULL或最初只是空的{}。
此查询将检查NULL或空{},还检查features密钥是否存在,但features如果已存在,则导致覆盖:
UPDATE entities SET config = JSON_SET(COALESCE(config, '{}'),
COALESCE("$.features", "features"), JSON_OBJECT("utilities",
JSON_OBJECT("water", TRUE, "gas", TRUE, "electric", TRUE)))
WHERE id = 123725082;
Run Code Online (Sandbox Code Playgroud)
除非该列已经包含以下内容,否则此方法可以正常工作:
{
"features": {
"divisions": true,
}
}
Run Code Online (Sandbox Code Playgroud)
它divisions用utilities对象覆盖。
所以我正在尝试JSON_INSERT查询;从我从mysql json函数文档中收集的信息应该可以正常工作,但是它返回null,我不明白为什么:
UPDATE entities SET config = JSON_INSERT(COALESCE(config, '{}'), …Run Code Online (Sandbox Code Playgroud) 在MySQL中查询json字段存在一个难以理解的问题。该data列的类型为json。
以下查询工作正常
SELECT * FROM `someTable` WHERE data->'$.someData' in ('A')
Run Code Online (Sandbox Code Playgroud)
但是,以下内容不返回任何内容。
SELECT * FROM `someTable` WHERE data->'$.someData' in ('A','B')
Run Code Online (Sandbox Code Playgroud)
有趣的是,这也起作用:
SELECT * FROM `someTable` WHERE data->'$.someData'='A' OR data->'$.someData'='B'
Run Code Online (Sandbox Code Playgroud)
我不知道为什么会这样。我最初认为以json查询格式执行的WHERE x IN可能会执行&&之类的操作,但是即使这些值是('A','A'),它仍然不会返回任何内容,这实际上表明WHERE x IN中有多个值不会工作。
样本数据(任何人都可以做)
id | data (json)
1 | {"someData":"A"}
2 | {"someData":"B"}
Run Code Online (Sandbox Code Playgroud)