【问题标题】:How to search JSON data associative array mysql 5.5如何搜索JSON数据关联数组mysql 5.5
【发布时间】:2019-09-02 10:13:38
【问题描述】:

我在 MySQL 5.5 的表列中存储了 JSON 关联数组数据。我想在 JSON 中搜索一个带有键和值的特定数组键 我的 JSON 结构:

   {
   "Interface_1":{
      "Caption":"[00000004] Intel(R) Dual Band Wireless-AC 3160",
      "MACAddress":"D0:7E:35:D3:C1:52",
      "DHCPServer":"192.168.1.1",
      "IPAddress":"192.168.1.101",
      "DNSServerSearchOrder":[
         "8.8.8.8",
         "9.9.9.9"
      ],
      "DefaultIPGateway":"192.168.1.1",
      "IPSubnet":"255.255.255.0"
   },
   "Interface_2":{
      "Caption":"[00000011] VMware Virtual Ethernet Adapter for VMnet1",
      "MACAddress":"00:50:56:C0:00:01",
      "IPAddress":[
         "192.168.29.1",
         "fe80::d9f4:2bfa:59f:b9ba"
      ],
      "IPSubnet":[
         "255.255.255.0",
         "64"
      ]
   },
   "Interface_3":{
      "Caption":"[00000013] VMware Virtual Ethernet Adapter for VMnet8",
      "MACAddress":"00:50:56:C0:00:08",
      "IPAddress":[
         "192.168.71.1",
         "fe80::acec:db96:af3a:4680"
      ],
      "IPSubnet":[
         "255.255.255.0",
         "64"
      ]
   }
}

所以对于键值搜索,我有这个查询:

SELECT * FROM `extable` 
WHERE network RLIKE '"MACAddress":"[[:<:]]00:50:56:C0:00:08[[:>:]]"'

它工作正常,但我的问题是我无法选择 Interface_1 并在其上搜索 MACAddress。 我想选择Interface_1并在上面搜索MACAddress。

【问题讨论】:

  • 一般说明:此数据库设计不是最佳的。如果您想出了它并且可以影响设计,请将其从存储无格式 JSON blob 更改为适当规范化的布局(拆分为表 interface、ip_address、ip_subnet 与外键关系)。
  • 更具体的说明:您永远不想在 JSON 上运行正则表达式(或 any 字符串函数)。 MySQL 有原生 JSON 函数,使用它们。 (虽然不是 5.5 - 你可能想升级,那个版本现在已经九年多了。)

标签: mysql sql json


【解决方案1】:

您可以将Interface_1 对象键包含在您的正则表达式中,从该点开始搜索 MAC 地址,但不要超过任何}(对象结尾)字符:

SELECT * FROM `extable` 
WHERE network RLIKE '"Interface_1":{[^}]*"MACAddress":"[[:<:]]00:50:56:C0:00:08[[:>:]]"'

Demo on dbfiddle

【讨论】:

  • 只要在"Interface_1 和"MACAddress" 之间存在对象属性就会中断,例如当属性"IPAddress" 在"MACAddress" 之前列出时。
  • @Tomalak 你所说的嵌套对象是对的,但在 OP 数据中,Interface 对象内的所有内容要么是简单元素,要么是数组(包括 IPAddress)。
【解决方案2】:

您可以使用 MySql 内置的 json 函数进行解析/搜索。

SELECT * FROM `extable` WHERE JSON_CONTAINS(network, "00:50:56:C0:00:08", '$.*.MACAddress')

编辑:刚刚意识到这仅在 >=MySQL 5.7 中受支持

【讨论】:

  • 由于OP专门要求Interface_1,所以路径应该是'$.Interface_1.MACAddress'。
猜你喜欢
  • 1970-01-01
  • 2015-08-05
  • 2018-09-17
  • 1970-01-01
  • 1970-01-01
  • 2019-08-02
  • 2020-04-16
  • 2012-09-04
相关资源
最近更新 更多