mysql/mariadb json\u extract和json\u contains

6tr1vspr  于 2021-06-20  发布在  Mysql
关注(0)|答案(1)|浏览(396)

我有一张结构如下的table:

  1. select * from test_table;
  2. id |load_balancer_name |listener_descriptions |
  3. ---|-------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
  4. 1 |with_cert_1 |[{"Listener": {"Protocol": "HTTPS", "LoadBalancerPort": 443, "InstanceProtocol": "HTTP", "InstancePort": 9005, "SSLCertificateId": "arn:aws:acm:us-west-2:xxxx:certificate/xxx"}, "PolicyNames": ["xxxx"]}] |
  5. 2 |with_cert_1 |[{"Listener": {"Protocol": "HTTPS", "LoadBalancerPort": 443, "InstanceProtocol": "HTTP", "InstancePort": 9005, "SSLCertificateId": "arn:aws:acm:us-west-2:xxxx:certificate/xxx"}, "PolicyNames": ["xxxx"]}] |
  6. 3 |with_cert_2 |[{"Listener": {"Protocol": "HTTPS", "LoadBalancerPort": 443, "InstanceProtocol": "HTTP", "InstancePort": 9005, "SSLCertificateId": "arn:aws:acm:us-west-2:xxxx:certificate/yyy"}, "PolicyNames": ["xxxx"]}] |
  7. 4 |no_cert | |

我需要的是根据 listener_descriptions 列。确保 JSON_* 方法有效,我做了这个查询,效果很好:

  1. select
  2. id, load_balancer_name,
  3. JSON_EXTRACT(listener_descriptions, "$[*].Listener.SSLCertificateId")
  4. from test_table;
  5. id |load_balancer_name |JSON_EXTRACT(listener_descriptions, "$[*].Listener.SSLCertificateId") |
  6. ---|-------------------|----------------------------------------------------------------------|
  7. 1 |with_cert_1 |["arn:aws:acm:us-west-2:xxxx:certificate/xxx"] |
  8. 2 |with_cert_1 |["arn:aws:acm:us-west-2:xxxx:certificate/xxx"] |
  9. 3 |with_cert_2 |["arn:aws:acm:us-west-2:xxxx:certificate/yyy"] |
  10. 4 |no_cert | |

现在我要选择所有匹配的行 SSLCertificateId :

  1. select
  2. *
  3. from test_table
  4. where JSON_CONTAINS(listener_descriptions, '"arn:aws:acm:us-west-2:xxxx:certificate/xxx"', "$[*].Listener.SSLCertificateId")
  5. ;

但没有找到结果。我尝试过在的第二个参数中使用单引号和双引号的多种组合 JSON_CONTAINS 没有成功。

  1. version() |
  2. -----------------------------------------|
  3. 10.3.8-MariaDB-1:10.3.8+maria~bionic-log |
li9yvcax

li9yvcax1#

JSON_CONTAINS() 不允许 [*] 在它的道路上。相反,使用 JSON_EXTRACT() 提取所有证书的数组,并使用 JSON_CONTAINS() 在那上面。

  1. select *
  2. FROM test_table
  3. WHERE JSON_CONTAINS(JSON_EXTRACT(listener_descriptions, "$[*].Listener.SSLCertificateId"), '"arn:aws:acm:us-west-2:xxxx:certificate/xxx"')
  4. ;

演示

相关问题