【问题标题】:How can I set all JSON keys as column name in MYSQL select如何在 MYSQL 选择中将所有 JSON 键设置为列名
【发布时间】:2018-05-11 05:38:01
【问题描述】:

在mysql表中的一列是json,我想选择JSON字段并设置为列名

类 3 的 Json 字段值

{"name": "xyz 1", "email": "xyz1@example.com"}
{"name": "xyz 2", "email": "xyz2@example.com"}

第四类

{"first_name": "abc1", "last_name": "pqr1"}
{"first_name": "abc2", "email": "pqr2"}

我可以将特定键设置为列名,如

select json_extract(my_tags,'$.name') as name from {table_name} where class = 3;

但我希望所有键值都作为选择结果中的列名。键值每次都会不同 从上面的示例结果列应该如下 姓名、电子邮件

select {my_tags} as name from {table_name} where class = 4;

但是对于第 4 类,需要的列名应该是 first_name 和 last_name

【问题讨论】:

  • 您可以使用 PHP 数组函数获取所有键作为列首先转换 JSON 解码然后使用 array_keys 然后 implode

标签: php mysql json


【解决方案1】:

您不能直接在 MySQL 中执行此操作。你可以结合 MySQL 和 PHP 来做这样的事情。查询:

SELECT JSON_KEYS(my_tags) AS tags, JSON_EXTRACT(my_tags, '$.*') AS values FROM {table_name}

然后在 PHP 中:

while ($row = $result->fetch()) {
    $tags = json_decode($row['tags']);
    $values = json_decode($row['values']);
    $data = array_combine($tags, $values);
    // process
}

这将为您提供一个关联数组,该数组与您从建议的单独列查询中获得的相同。如果这使处理更容易,您可以将array_merge $data 放入 $row。

【讨论】:

  • 这个答案有什么问题?
【解决方案2】:

您可以编写如下查询:

select 
  json_extract(my_tags,'$.name') as name
  json_extract(my_tags,'$.email') as email
from table_name;

所以你的结果将是:

name email
xyz  xyz@example.com

【讨论】:

  • 是的,但是这个键有时会改变它而不是静态的,它会是年龄和名字
  • 如果 json 中没有名称,那么我猜它会显示名称为 null。对于年龄,您可以添加相同的姓名和电子邮件
【解决方案3】:

你可以从下面的例子中得到想法

select  * from json_table(json_keys('{"shop_name":"National Chemist","shop_address":"dfsf","shop_email":"abc@gm","shop_mobile":"4545","shop_license":"4543545","invoice_bill_format":"a4_gst_logo","invoice_terms":"sdfdfds","invoice_popup":false,"sms_pack":false,"sms_tempalte":"dfdsff"}'
),'$[*]' COLUMNS( name varchar(20) PATH '$'))
as t

它会给你这样的输出

店铺名称
shop_address
电子邮件
....

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-03-30
    • 2019-09-05
    • 2013-04-11
    • 1970-01-01
    • 2021-10-30
    • 2013-12-11
    • 1970-01-01
    相关资源
    最近更新 更多