【问题标题】:Extract value without quotation mark from MySQL JSON data type从 MySQL JSON 数据类型中提取不带引号的值
【发布时间】:2016-08-24 08:14:52
【问题描述】:

我已经开始在 mysql 5.7 中使用 JSON 数据类型。有没有办法在没有引号的情况下提取值?例如在设置虚拟索引时。

例子:

mysql> INSERT INTO test (data) VALUES ('{"type": "user" , 
"content" : { "username": "jdoe", "firstname" : "John", "lastname" : "Doe" } }');

mysql> SELECT json_extract(data,'$.type') FROM test;
+-----------------------------+
| json_extract(data,'$.type') |
+-----------------------------+
| "user"                      |
+-----------------------------+

如何获得

+-----------------------------+
| json_extract(data,'$.type') |
+-----------------------------+
| user                        |
+-----------------------------+

?

【问题讨论】:

    标签: mysql json


    【解决方案1】:
    SELECT left(right(json_extract(data,'$.type'),5),4) FROM test;
    

    【讨论】:

    • 这行得通!我唯一不太喜欢它的是它假设要提取的内容的大小......
    【解决方案2】:

    您可以使用CAST() 函数将json对象转换为varchar

    SELECT CAST(json_extract(data,'$.type') AS VARCHAR) FROM test;
    

    【讨论】:

    • 不幸的是我试过了,但这似乎不起作用,虽然它看起来像一个干净的解决方案。如果我像 VARCHAR 一样投射,它会给我 ERROR 1064 (42000)。我可以像 CHAR 一样转换它,但它会保留引号......这里说 VARCHAR 被排除在允许的类型之外dev.mysql.com/doc/refman/5.7/en/…
    • 这不起作用。它会将其转换为 VARCHAR with 引号
    • 使用 JSON_UNQUOTE( 而不是 CAST(
    【解决方案3】:

    我找到了一个最干净的解决方案。 CAST 函数不起作用,@Pryanshu 的答案可以通过使用来独立于值长度

    SELECT TRIM(BOTH '"' FROM json_extract(data,'$.type')) FROM test;
    

    【讨论】:

    • 这是不安全的命令:SELECT TRIM(BOTH '"' FROM '"\\"A\\""') 结果是 '\"A\'。
    • 修剪不会纠正 (\") 之类的东西,它需要取消引用 :)
    【解决方案4】:

    您还可以修改列本身,使引号不在生成的列中

    alter table your_table add your_field varchar(25) GENERATED ALWAYS AS (TRIM(BOTH '"' FROM json_extract(json_field,'$.your_field')))
    

    【讨论】:

      【解决方案5】:

      您可以使用 JSON_UNQUOTE() 方法:

      SELECT JSON_UNQUOTE(json_extract(data,'$.type')) FROM test;
      

      这个方法会处理内部引号,例如:

      SET @t1 := '{"a": "Hello \\\"Name\\\""}';
      SET @j := CAST(@t1 AS JSON);
      SET @tOut := JSON_EXTRACT(@j, '$.a');
      SELECT @t1, @j, @tOut, JSON_UNQUOTE(@tOut), TRIM(BOTH '"' FROM @tOut);
      

      将给予:

      @t1     : {"a": "Hello \"Name\""}
      @j      : {"a": "Hello \"Name\""}
      @tOut   : "Hello \"Name\""
      unquote : Hello "Name"
      trim    : Hello \"Name\
      

      我相信在几乎所有情况下,取消引用都会更好。

      【讨论】:

      • 我认为这个答案是最好的,因为它将处理诸如“Hello \"Name\""之类的内部引用。
      • (添加示例)
      【解决方案6】:

      您可以简单地使用 ->> 运算符来提取未引用的数据!

      SELECT JSONCOL->>'$.PATH' FROM tableName
      

      另外两种方式:

      • JSON_UNQUOTE(JSON_EXTRACT(列,路径))
      • JSON_UNQUOTE(列->路径)

      注意:正如EXPLAIN 解释的那样,三种不同的方式产生相同的命令:

      与 -> 一样,->> 运算符始终在 EXPLAIN 的输出中展开,如下例所示:

      EXPLAIN SELECT c->>'$.name' AS name FROM jemp WHERE g > 2 ;
      SHOW WARNINGS ;
      *************************** 1. row ***************************
      Level: Note
      Code: 1003
      Message: /* select#1 */ select
      json_unquote(json_extract(`jtest`.`jemp`.`c`,'$.name')) AS `name` from
      `jtest`.`jemp` where (`jtest`.`jemp`.`g` > 2)
      1 row in set (0.00 sec)
      

      阅读更多关于 MySQL 参考手册https://dev.mysql.com/doc/refman/5.7/en/json-search-functions.html#operator_json-inline-path

      注意:->> 运算符是在 MySQL 5.7.13

      中添加的

      【讨论】:

      • ->> 是最干净的解决方案。谢谢!
      【解决方案7】:

      MySQL 8.0.21 支持JSON_VALUE 函数

      从指定文档中给定路径的 JSON 文档中提取一个值,并返回提取的值,可选择将其转换为所需的类型。完整的语法如下所示:

      JSON_VALUE(json_doc, path [RETURNING type] [on_empty] [on_error])
      on_empty:
             {NULL | ERROR | DEFAULT value} ON EMPTY
      on_error:
             {NULL | ERROR | DEFAULT value} ON ERROR
      

      如果没有由 RETURNING 子句指定,则 JSON_VALUE() 函数的返回类型为 VARCHAR(512)

      db<>fiddle demo

      SELECT json_value(data,'$.type')
      FROM test;
      -- user
      

      【讨论】:

        【解决方案8】:

        另一种方法是;

        SELECT JSON_UNQUOTE(JSON_EXTRACT(data, '$.type')) FROM test
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-07-07
          • 1970-01-01
          • 2015-07-24
          • 2018-12-25
          • 1970-01-01
          • 2023-03-15
          相关资源
          最近更新 更多