sql从json中提取数组元素

vom3gejh  于 2021-07-24  发布在  Java
关注(0)|答案(2)|浏览(864)

我有一个来自存储在sql server数据库中的google地理编码api的以下响应字符串:

  1. {
  2. "results":[
  3. {
  4. "address_components":[
  5. {
  6. "long_name":"Khalifa City",
  7. "short_name":"Khalifa City",
  8. "types":[
  9. "political",
  10. "sublocality",
  11. "sublocality_level_1"
  12. ]
  13. },
  14. {
  15. "long_name":"Abu Dhabi",
  16. "short_name":"Abu Dhabi",
  17. "types":[
  18. "locality",
  19. "political"
  20. ]
  21. },
  22. {
  23. "long_name":"Abu Dhabi",
  24. "short_name":"Abu Dhabi",
  25. "types":[
  26. "administrative_area_level_1",
  27. "political"
  28. ]
  29. },
  30. {
  31. "long_name":"United Arab Emirates",
  32. "short_name":"AE",
  33. "types":[
  34. "country",
  35. "political"
  36. ]
  37. }
  38. ],
  39. ...
  40. }
  41. ],
  42. "status":"OK"
  43. }

我的任务是从上面的json中提取国家和城市。我检查了数据,似乎地理编码api并不总是在address\u component节点中返回4个元素,因此我需要在数组中获取元素,其中类型包含城市的administrative\u area\u level\u 1,例如,逻辑上应该是这样的:

  1. JSON_QUERY([Json], '$.results[0].address_components<where types = administrative_area_level_1>.short_name')
yebdmbv4

yebdmbv41#

我过去就是这样处理这个问题的。您可以在ssms中运行:

  1. DECLARE @json AS VARCHAR(1000) = '{ "results":[ { "address_components":[
  2. { "long_name":"Khalifa City", "short_name":"Khalifa City", "types":[ "political", "sublocality", "sublocality_level_1" ] },
  3. { "long_name":"Abu Dhabi", "short_name":"Abu Dhabi", "types":[ "locality", "political" ] },
  4. { "long_name":"Abu Dhabi", "short_name":"Abu Dhabi", "types":[ "administrative_area_level_1", "political" ] },
  5. { "long_name":"United Arab Emirates", "short_name":"AE", "types":[ "country", "political" ] }
  6. ] } ], "status":"OK" }';
  7. SELECT
  8. Addresses.long_name, Addresses.short_name, Addresses.[types]
  9. FROM OPENJSON ( @json, '$.results' ) WITH (
  10. addresses NVARCHAR(MAX) '$.address_components' AS JSON
  11. ) AS j
  12. CROSS APPLY (
  13. SELECT * FROM OPENJSON ( j.addresses ) WITH (
  14. long_name VARCHAR(50) '$.long_name',
  15. short_name VARCHAR(50) '$.short_name',
  16. [types] NVARCHAR(MAX) '$.types' AS JSON
  17. ) AS Names
  18. CROSS APPLY OPENJSON ( [types] ) AS [Types]
  19. WHERE [Types].[value] = 'administrative_area_level_1'
  20. ) AS Addresses;

退货

  1. +-----------+------------+------------------------------------------------+
  2. | long_name | short_name | types |
  3. +-----------+------------+------------------------------------------------+
  4. | Abu Dhabi | Abu Dhabi | [ "administrative_area_level_1", "political" ] |
  5. +-----------+------------+------------------------------------------------+
展开查看全部
vvppvyoh

vvppvyoh2#

如果我理解了这个问题,而您想要解析输入json(即使 $.results json数组有多个项),以下方法可能会有所帮助:
json码:

  1. DECLARE @json nvarchar(max) = N'{
  2. "results":[
  3. {
  4. "address_components":[
  5. {"long_name":"Khalifa City", "short_name":"Khalifa City", "types":["political", "sublocality", "sublocality_level_1"]},
  6. {"long_name":"Abu Dhabi", "short_name":"Abu Dhabi", "types":["locality", "political"]},
  7. {"long_name":"Abu Dhabi", "short_name":"Abu Dhabi", "types":["administrative_area_level_1", "political"]},
  8. {"long_name":"United Arab Emirates", "short_name":"AE", "types":["country", "political"]}
  9. ]
  10. }
  11. ],
  12. "status":"OK"
  13. }'

声明:

  1. SELECT j2.long_name, j2.short_name
  2. FROM OPENJSON(@json, '$.results') j1
  3. CROSS APPLY OPENJSON(j1.value, '$.address_components') WITH (
  4. long_name varchar(100) '$.long_name',
  5. short_name varchar(100) '$.short_name',
  6. types nvarchar(max) '$.types' AS JSON
  7. ) j2
  8. CROSS APPLY OPENJSON(j2.types) j3
  9. WHERE j3.[value] = 'administrative_area_level_1'

输出:

  1. long_name short_name
  2. ----------------------
  3. Abu Dhabi Abu Dhabi
展开查看全部

相关问题