草庐IT

MySQL:JSON 到结果集

coder 2023-10-26 原文

我有一个存档表,其中有一列包含未索引的 json 记录。示例:

[{
    "attr1": "val1",
    "attr2": "val2",
    "attr3": "val3",
    .
    .
    "attrN": "valN"
}, {
    "attr1": "val1.2",
    "attr2": "val2.2",
    "attr3": "val3.2",
    .
    .
    "attrN": "valN.2"
},...]

我需要创建一个将 json 作为结果集返回的存储过程或函数:

  attr1   |   attr2    |   attr3  | ... |  attrN
  _______________________________________________
  val1    |    val2    |   val3   | ... |  valN
  val1.2  |    val2.2  |   val2.2 | ... |  valN.2

我需要它作为记录集返回,因为我将它用于其他存储过程中的其他查询。

我能够通过以下方式实现这一目标:Read JSON array in MYSQL

但是我想知道除了创建临时表还有别的方法吗?我在考虑性能和效率。比如,如果 20 或 50 个用户触发了这个怎么办?有更好的方法吗?

注意:json 的平均大小约为 1MB

最佳答案

此存储过程创建一个动态查询,输出您需要的结果,应使用真实数据进行测试以检查性能是否足够好:

CREATE PROCEDURE jsonToCols(IN json JSON, IN target VARCHAR(50))
BEGIN
    SET @j = 0;
    SET @fields = JSON_KEYS(json, "$[0]");
    SET @f_length = JSON_LENGTH(@fields);
    SET @select = "";
    WHILE @j < JSON_LENGTH(json) DO
      SET @i = 0;
      SET @select = CONCAT(@select, "SELECT ");
      WHILE @i < @f_length DO
          SET @attr_name = REPLACE(JSON_EXTRACT(@fields, CONCAT("$[", @i, "]")), '\"', '');
          SET @key = CONCAT('$.', @attr_name);
          SET @select = CONCAT(@select, "JSON_EXTRACT(json, '$[", @j , "].", @attr_name, "') as ", @attr_name, ", ");
          SET @i = @i + 1;
      END WHILE;

      SET @select = CONCAT(LEFT(@select, length(@select)-2), " FROM ", target ," UNION ALL ");
      SET @j = @j + 1;
    END WHILE;

    SET @select = LEFT(@select, length(@select)-11);

    PREPARE stmt FROM @select;
    EXECUTE stmt;
    DEALLOCATE PREPARE stmt;
END;

动态创建的查询如下所示:

SELECT JSON_EXTRACT(json, '$[0].attr1') as attr1, JSON_EXTRACT(json, '$[0].attr2') as attr2, JSON_EXTRACT(json, '$[0].attr3') as attr3, JSON_EXTRACT(json, '$[0].attrN') as attrN 
FROM test 
UNION ALL 
SELECT JSON_EXTRACT(json, '$[1].attr1') as attr1, JSON_EXTRACT(json, '$[1].attr2') as attr2, JSON_EXTRACT(json, '$[1].attr3') as attr3, JSON_EXTRACT(json, '$[1].attrN') as attrN 
FROM test

FIDDLE

关于MySQL:JSON 到结果集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47524981/

有关MySQL:JSON 到结果集的更多相关文章

  1. ruby-on-rails - Rails HTML 请求渲染 JSON - 2

    在我的Controller中,我通过以下方式在我的index方法中支持HTML和JSON:respond_todo|format|format.htmlformat.json{renderjson:@user}end在浏览器中拉起它时,它会自然地以HTML呈现。但是,当我对/user资源进行内容类型为application/json的curl调用时(因为它是索引方法),我仍然将HTML作为响应。如何获取JSON作为响应?我还需要说明什么? 最佳答案 您应该将.json附加到请求的url,提供的格式在routes.rb的路径中定义。这

  2. ruby-on-rails - 如何使用 Rack 接收 JSON 对象 - 2

    我有一个非常简单的RubyRack服务器,例如:app=Proc.newdo|env|req=Rack::Request.new(env).paramspreq.inspect[200,{'Content-Type'=>'text/plain'},['Somebody']]endRack::Handler::Thin.run(app,:Port=>4001,:threaded=>true)每当我使用JSON对象向服务器发送POSTHTTP请求时:{"session":{"accountId":String,"callId":String,"from":Object,"headers":

  3. 报告回顾丨模型进化狂飙,DetectGPT能否识别最新模型生成结果? - 2

    导读语言模型给我们的生产生活带来了极大便利,但同时不少人也利用他们从事作弊工作。如何规避这些难辨真伪的文字所产生的负面影响也成为一大难题。在3月9日智源Live第33期活动「DetectGPT:判断文本是否为机器生成的工具」中,主讲人Eric为我们讲解了DetectGPT工作背后的思路——一种基于概率曲率检测的用于检测模型生成文本的工具,它可以帮助我们更好地分辨文章的来源和可信度,对保护信息真实、防止欺诈等方面具有重要意义。本次报告主要围绕其功能,实现和效果等展开。(文末点击“阅读原文”,查看活动回放。)Ericmitchell斯坦福大学计算机系四年级博士生,由ChelseaFinn和Chri

  4. 使用canal同步MySQL数据到ES - 2

    文章目录一、概述简介原理模块二、配置Mysql使用版本环境要求1.操作系统2.mysql要求三、配置canal-server离线下载在线下载上传解压修改配置单机配置集群配置分库分表配置1.修改全局配置2.实例配置垂直分库水平分库3.修改group-instance.xml4.启动监听四、配置canal-adapter1修改启动配置2配置映射文件3启动ES数据同步查询所有订阅同步数据同步开关启动4.验证五、配置canal-admin一、概述简介canal是Alibaba旗下的一款开源项目,Java开发。基于数据库增量日志解析,提供增量数据订阅&消费。Git地址:https://github.co

  5. ruby - 用 YAML.load 解析 json 安全吗? - 2

    我正在使用ruby2.1.0我有一个json文件。例如:test.json{"item":[{"apple":1},{"banana":2}]}用YAML.load加载这个文件安全吗?YAML.load(File.read('test.json'))我正在尝试加载一个json或yaml格式的文件。 最佳答案 YAML可以加载JSONYAML.load('{"something":"test","other":4}')=>{"something"=>"test","other"=>4}JSON将无法加载YAML。JSON.load("

  6. ruby-on-rails - 无法安装 mysql2 0.3.14 gem - 2

    我看到其他人也遇到过类似的问题,但没有一个解决方案对我有用。0.3.14gem与其他gem文件一起存在。我已经完全按照此处指示完成了所有操作:https://github.com/brianmario/mysql2.我仍然得到以下信息。我不知道为什么安装程序指示它找不到include目录,因为我已经检查过它存在。thread.h文件存在,但不在ruby​​目录中。相反,它在这里:C:\RailsInstaller\DevKit\lib\perl5\5.8\msys\CORE\我正在运行Windows7并尝试在Aptana3中构建我的Rails项目。我的Ruby是1.9.3。$gemin

  7. ruby - 如何使用 ruby​​ mysql2 执行事务 - 2

    我已经开始使用mysql2gem。我试图弄清楚一些基本的事情——其中之一是如何明确地执行事务(对于批处理操作,比如多个INSERT/UPDATE查询)。在旧的ruby-mysql中,这是我的方法:client=Mysql.real_connect(...)inserts=["INSERTINTO...","UPDATE..WHEREid=..",#etc]client.autocommit(false)inserts.eachdo|ins|beginclient.query(ins)rescue#handleerrorsorabortentirelyendendclient.commi

  8. ruby-on-rails - Rails 渲染带有驼峰命名法的 json 对象 - 2

    我在一个简单的RailsAPI中有以下Controller代码:classApi::V1::AccountsControllerehead:not_foundendendend问题在于,生成的json具有以下格式:{id:2,name:'Simpleaccount',cash_flows:[{id:1,amount:34.3,description:'simpledescription'},{id:2,amount:1.12,description:'otherdescription'}]}我需要我生成的json是camelCase('cashFlows'而不是'cash_flows'

  9. ruby - 使用 JSON gem 将自定义对象转换为 JSON - 2

    我正在学习如何使用JSONgem解析和生成JSON。我可以轻松地创建数据哈希并将其生成为JSON;但是,在获取一个类的实例(例如Person实例)并将其所有实例变量放入哈希中以转换为JSON时,我脑袋放屁。这是我遇到问题的例子:require"json"classPersondefinitialize(name,age,address)@name=name@age=age@address=addressenddefto_jsonendendp=Person.new('JohnDoe',46,"123ElmStreet")p.to_json我想创建一个.to_json方法,这样我就可以获

  10. ruby-on-rails - 如何使用驼峰键名称从 Rails 返回 JSON - 2

    我正在构建一个带有Rails后端的JS应用程序,为了不混淆snake和camelcases,我想通过从服务器返回camelcase键名来规范化这一切。因此,当从API返回时,user.last_name将返回user.lastName。我如何实现这一点?谢谢!编辑:添加Controller代码classApi::V1::UsersController 最佳答案 我的方法是使用ActiveModelSerializer和json_api适配器:在你的Gemfile中,添加:gem'active_model_serializers'创建

随机推荐