MySQL获得JSON值

时间:2015-11-01 18:21:19

标签: mysql json

在我的MySql播放器表中,我有一个名为achievements的列,它是一个文本字段,在此特定行中具有此值:

[  
    {  
        "value":11,
        "globalID":23000000
    },
    {  
        "value":11,
        "globalID":23000001
    },
    {  
        "value":11,
        "globalID":23000002
    },
    ...
    {  
        "value":6044730,
        "globalID":23000065
    }
]

在数组底部附近,您可以看到此对象:

{  
    "value":48,
    "globalID":23000062
},

我需要能够解析值字段并将其显示为warhero字段。但是我怎么能这样做呢? globalID将保持不变,但值会发生变化。因为globalID位于value值之后,我无法使用此帖中使用的内容:https://stackoverflow.com/a/21596032/4942382

我需要运行什么SQL查询来获取该值?

谢谢!

2 个答案:

答案 0 :(得分:1)

你应该从未在表中保存JSON,你已经破坏了关系数据库设计的规则。

mysql无法理解数据,因此没有SQL查询可以帮助您,您有两个选择:

  • 修复数据库设计,创建表以保存该数据而不是JSON
  • 获取数据,解码JSON,并执行所有类型的操作和黑客攻击以获得所需的值。

答案 1 :(得分:0)

如果表中的非原子值存储在单个列中,则表的设计甚至不满足第一个规范化级别,这种类型的JSON编码值就是这种情况。

现在,如果您无权访问JSON函数available to MySql version 5.7+,并且您的 globalID 具有固定的位数,那么您可以执行以下字符串匹配。

例如,如果您需要与 globalID 23000062一起使用的值,那么您可以这样做:

SELECT  players.*,
        CAST(
            SUBSTRING_INDEX(
                SUBSTRING_INDEX(achievements, '"globalID":23000062', 1),
                '"value":',
                -1
            )
        AS UNSIGNED) AS json_extracted_value
FROM    players
WHERE   INSTR(achievements, '"globalID":23000062') > 0

但实际上,您应该认真考虑重新设计数据库。