【问题标题】:Can't get access to data from nested json's array无法访问嵌套 json 数组中的数据
【发布时间】:2021-11-23 23:56:03
【问题描述】:

如何从employment_typestypesalary)和skillsnamelevel)数组中检索值并在列中显示它们?我试过employment_types,更不用说skills了:

declare @json nvarchar(max)
set @json = '[
  {
    "title": "IT Admin",
    "experience_level": "mid",
    "employment_types": [
      {
        "type": "permanent",
        "salary": null
      }
    ],
    "skills": [
      {
        "name": "Security",
        "level": 3
      },
      {
        "name": "WIFI",
        "level": 3
      },
      {
        "name": "switching",
        "level": 3
      }
    ]
  },
  {
    "title": "Lead QA Engineer",
    "experience_level": "mid",
    "employment_types": [
      {
        "type": "permanent",
        "salary": {
          "from": 7000,
          "to": 13000,
          "currency": "pln"
        }
      }
    ],
    "skills": [
      {
        "name": "Embedded C",
        "level": 4
      },
      {
        "name": "Quality Assurance",
        "level": 4
      },
      {
        "name": "C++",
        "level": 4
      }
    ]
  }
]';


SELECT *
FROM OPENJSON(@JSON, '$.employment_types')
WITH
(
    type nvarchar(50) '$.type',
    salary varchar(max) '$.salary'

)

有将近 7000 条记录,我想从所有这些列中显示上述列。

【问题讨论】:

  • 鉴于可能有多个employment_types 和多个skills,您对此样本的预期结果是什么?

标签: json sql-server tsql parsing open-json


【解决方案1】:

鉴于employment_typesskills 都是数组,因此很难确切知道您想要什么。但是假设employment_types 总是只有一个元素,你可以这样做

SELECT
  j1.title,
  j1.experience_level,
  j1.employment_type,
  salary = j1.salary_currency + ' ' + CONCAT(j1.salary_from, ' - ', j1.salary_to),
  j2.name,
  j2.level
FROM OPENJSON(@JSON)
  WITH (
    title nvarchar(100),
    experience_level nvarchar(10),
    employment_type nvarchar(50) '$.employment_types[0].type',
    salary_from int '$.employment_types[0].salary.from',
    salary_to int '$.employment_types[0].salary.to',
    salary_currency char(3) '$.employment_types[0].salary.currency',
    skills nvarchar(max) AS JSON
  ) j1
CROSS APPLY OPENJSON(j1.skills)
WITH
(
    name nvarchar(50),
    level int
) j2

db<>fiddle

  • 由于我们直接从根对象中提取数据,因此我们不需要 JSON 路径参数。 OPENJSON 将自动将数组拆分为单独的行。如果您只想要employment_types,您可以直接使用路径参数。
  • employment_types[0] 表示只获取数组的第一个元素。如果你想要所有元素,你将需要另一个OPENJSON
  • 注意AS JSON对于skills的使用,这意味着整个JSON数组被拉出,然后可以通过另一个调用OPENJSON来推送

【讨论】:

  • 谢谢,非常感谢您的努力,但我还有一个问题。在我在这里提出问题之前,我查看了几个类似的问题/教程,其中绝大多数都在 OPENJSON 中使用 JSONpath 参数,就像我在我的代码中所做的那样(OPENJSON(@JSON,'$.employment_types'))。我很好奇为什么它不起作用以及代码中括号中的这个零是如何起作用的。只是需要进一步解释。
  • 好的,给你更多的解释。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-05
  • 2015-10-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多