【问题标题】:how to extract data from a json file into table using sql query如何使用sql查询将json文件中的数据提取到表中
【发布时间】:2021-05-09 22:26:17
【问题描述】:

如何使用 SQL 将 JSON 文件中的数据导入表中?我在使用 SQL 时遇到问题,我无法读取“值”“键”,因为它们是保留字。

这里是 SQL 查询的一部分和 JSON 文件的一部分:

DECLARE @JSON_table VARCHAR(MAX)

SELECT @JSON_table = BulkColumn
FROM OPENROWSET (BULK 'C:\Users\dbjx1038\Desktop\sql\inventory.json', SINGLE_CLOB) import

SELECT ISJSON(@JSON_table) 
SELECT @JSON_table AS 'JSON Text'

SELECT * FROM OPENJSON (@JSON_table)

SELECT * 
FROM OPENJSON (@JSON_table, '$.header.columns') 
     WITH (title VARCHAR(50),
           [property] VARCHAR(50),
           minWidth int,
           dataType VARCHAR(50),
           hideable VARCHAR(10))

SELECT *  
FROM OPENJSON (@JSON_table, '$.header.fields')
     WITH (property VARCHAR(50),
           dataType VARCHAR(50),
           display VARCHAR(50))

SELECT *  
FROM OPENJSON (@JSON_table, '$.data')
     WITH (deviceType VARCHAR(50),
           validity VARCHAR(50),
           chasisNumber NVARCHAR(50),
           serialNumber NVARCHAR(50))

{
    "columns": [
      {
        "title": "Impacted Entities",
        "property": "values_short_display",
        "minWidth": 250,
        "dataType": "jsonArray"
      },
      {
        "title": "Impacted Entities Details",
        "property": "values",
        "hideable": true,
        "visible": false,
        "minWidth": 250,
        "dataType": "jsonArray"
      },
      {
        "title": "Severity",
        "property": "severity",
        "display": "iconAndText",
        "iconProperty": "severity",
        "hideable": false,
        "icon": [
          {
            "key": "Minor",
            "value": "images/event_minor.png"
          },
          {
            "key": "Medium",
            "value": "images/event_other.png"
          }
        ],
        "minWidth": 70,
        "dataType": "string"
      },
      {
        "title": "Alarm Name",
        "property": "rule_name_display",
        "hideable": false,
        "minWidth": 160,
        "dataType": "string"
      },
      {
        "title": "Cleared Date & Time",
        "property": "cleared_time",
        "displayFormat": "DD MMM YYYY h:mm:ss A z",
        "inputFormat": "unix-time",
        "minWidth": 200,
        "dataType": "date"
      }
    ],
    "fields": [
      {
        "property": "values_short_display",
        "dataType": "jsonArray"
      },
      {
        "property": "uuid",
        "dataType": "string"
      },
      {
        "property": "cleared_by",
        "dataType": "string"
      }
    ],   

我想制作包含列中这些数据的表,以及如何读取项目“entry_time”,因为破折号会导致错误

【问题讨论】:

  • JSON 支持高度特定于供应商 - 所以请添加一个标签来指定您是否使用mysqlpostgresqlsql-serveroracledb2 - 或完全不同的东西。
  • 使用 sql_server

标签: json sql-server create-table


【解决方案1】:

关于你问题的第一部分,这里是如何提取 keyvalue 的值...

select title, [property], display, iconProperty, hideable, minWidth, dataType, [key], [value]
from openjson(@JSON_table, '$.header.columns') with (
  title varchar(50),
  [property] varchar(50),
  display varchar(50),
  iconProperty varchar(50),
  hideable bit,
  icon nvarchar(max) as json, --<<-- NOTE: *N*varchar(max) as json
  minWidth int,
  dataType varchar(50)
) j
outer apply openjson(icon) with (
  [key] varchar(50),
  [value] varchar(100)
) i;

请注意,这会为 Severity 返回两行,因为它的 icon 包含 MinorMedium 键:

title property display iconProperty hideable minWidth dataType key value
Impacted Entities values_short_display 250 jsonArray
Impacted Entities Details values True 250 jsonArray
Severity severity iconAndText severity False 70 string Minor images/event_minor.png
Severity severity iconAndText severity False 70 string Medium images/event_other.png
Alarm Name rule_name_display False 160 string
Cleared Date & Time cleared_time 200 date

【讨论】:

  • 谢谢,但是如何从“header.fields”中提取数据并将其放在同一个表中?
猜你喜欢
  • 1970-01-01
  • 2022-11-23
  • 1970-01-01
  • 2023-02-25
  • 1970-01-01
  • 1970-01-01
  • 2021-12-20
  • 2021-11-29
  • 1970-01-01
相关资源
最近更新 更多