标签: mysql-json

在 MySQL 5.7 中弹出 JSON 数组中的最后一项

我在名为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 arrays mysql-json

3
推荐指数
1
解决办法
2154
查看次数

MySQL:从 JSON 字段中选择布尔值

我正在使用 MySQL 5.7.19

我正在尝试检索一个如下所示的类

class Task
{
    public $title;
    public $done;
}
Run Code Online (Sandbox Code Playgroud)

和属性保存在 JSON 列中titledone

我用来检索的代码如下所示:

    $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”而不是布尔值。

php mysql json pdo mysql-json

3
推荐指数
1
解决办法
5658
查看次数

在mysql中通过key在json中查找

我有一个 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 很复杂,包含嵌套对象和数组


编辑

它有效,所以我现在尝试使用更新后的 json,它看起来像 …

mysql search json mysql-json

3
推荐指数
1
解决办法
1万
查看次数

MYSQL JSON_SET 添加反斜杠

我想更新数据库中的 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)

谢谢您的帮助。

mysql arrays json mysql-json

3
推荐指数
1
解决办法
2019
查看次数

MySQL JSON:如何从键值查找对象

我正在尝试找到一种方法来搜索 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 mysql-json

3
推荐指数
1
解决办法
6124
查看次数

用于遍历数组的mysql JSON路径的正确语法?

我的问题是在搜索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结果:barbaz

我可以跑

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)

我的查询有什么问题?

mysql mysql-json

2
推荐指数
1
解决办法
2131
查看次数

MySQL/MariaDB JSON_EXTRACT 和 JSON_CONTAINS

我有一个具有以下结构的表:

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)

mysql json mariadb mysql-json

2
推荐指数
1
解决办法
5469
查看次数

如果不存在,则追加 mysql json 字段

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)

有没有办法做到这一点?

mysql json mysql-json

2
推荐指数
1
解决办法
1519
查看次数

MySQL 8:使用 JSON_TABLE 的子查询无法工作,除非手动输入子查询结果

这是我面临的问题的最低工作版本。按照文档页面上的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 subquery mysql-json

2
推荐指数
1
解决办法
1991
查看次数

从 MySQL 中的 JSON 对象中提取密钥对值

从 MySQL JSON 数据字段中,我从数组中提取数据,如下所示:

\n
SELECT \ndata ->> \'$.fields[*]\' as fields \nFROM some_database...\n
Run 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}]\n
Run 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}]\n
Run Code Online (Sandbox Code Playgroud)\n

并返回以下结果:

\n
[test@example.com, Aneta]\n …
Run Code Online (Sandbox Code Playgroud)

mysql database mysql-json

2
推荐指数
1
解决办法
2759
查看次数

mysql JSON_SET或JSON_INSERT函数将对象插入嵌套对象(如果存在)

我有一个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)

divisionsutilities对象覆盖。

所以我正在尝试JSON_INSERT查询;从我从mysql json函数文档中收集的信息应该可以正常工作,但是它返回null,我不明白为什么:

UPDATE entities SET config = JSON_INSERT(COALESCE(config, '{}'), …
Run Code Online (Sandbox Code Playgroud)

mysql json object mysql-json

1
推荐指数
1
解决办法
2199
查看次数

WHERE x IN使用单个值,而不使用json上的多个

在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)

mysql where where-in mysql-json

1
推荐指数
1
解决办法
46
查看次数

标签 统计

mysql ×12

mysql-json ×12

json ×7

arrays ×2

database ×1

mariadb ×1

object ×1

pdo ×1

php ×1

search ×1

subquery ×1

where ×1

where-in ×1