【问题标题】:Load JSON data obtained from a column of a CSV to populate a table加载从 CSV 列中获取的 JSON 数据以填充表
【发布时间】:2021-05-14 07:39:40
【问题描述】:

我在使用 SQL Server 将 JSON 格式的数据加载到表中时遇到问题。

我在 CSV 文件中有以下行:

A: 15957
B: test_category_labeling_highlight_fordham_bbbbb
C: 116
D: 3864
E: 1
F: Policy Change
G: {"Change Type": {"selectedText": "Privacy Policy Last modified: June 30, 2015 (view archived versions)", "startIndexInSegment": 0, "endIndexInSegment": 79, "value": "Unspecified"} , "User Choice": {"selectedText": "Privacy Policy Last modified: June 30, 2015 (view archived versions)", "startIndexInSegment": 0, "endIndexInSegment": 79, "value": "Unspecified"}, " Notification Type ": {" selectedText ":" Privacy Policy Last modified: June 30, 2015 (view archived versions) "," startIndexInSegment ": 0," endIndexInSegment ": 79," value ":" General notice in privacy policy "} }
H: 6/30/15
I: https://www. google.com/intl/en/policies/privacy/

我对 G、H、I 列感兴趣。

要加载数据使用

CREATE TABLE #tempTable1
(
    a VARCHAR(max),
    b VARCHAR(max),
    c VARCHAR(max),
    d VARCHAR(max),
    e VARCHAR(max),
    f VARCHAR(max),
    g VARCHAR(max),
    h VARCHAR(max),
    i VARCHAR(max),
);

BULK INSERT #tempTable1
FROM 'C:\Users\file.csv'
WITH (FORMAT = 'CSV', ROWTERMINATOR = '\n', FIRSTROW = 2);

ALTER TABLE #tempTable1 
    DROP COLUMN a, b, c, d, e, f, h, i;

到目前为止它对我有好处,我得到一列,每行都有 JSON 值的单元格{...}。

现在,我必须以某种方式重新转换生成的表。 h和i列的值是一样的,只是JSON变化了。在我尝试过的临时变量中声明所述 JSON

DECLARE @json varchar (max);

SELECT g INTO @json FROM #tempTable1; 

但没有成功以后用

访问它的键值
INSERT INTO Data (G_1, G_2, E, F)
SELECT *
FROM OPENJSON (@JSON)
    WITH (
          G_1 VARCHAR(50) '$."Personal Information Type".value',
          G_2 VARCHAR(100) '$."Purpose".value'
         );

【问题讨论】:

  • 也许您的 JSON 示例数据不完整 - 它不包括 PurposePersonal Information Type 的键。
  • openjson() 中使用的 JSON 路径格式也不正确。假设这些密钥存在,它们需要是 '$."Personal Information Type".value''$.Purpose.value'
  • @AlwaysLearning 我还没有到达那个区域,因为错误确实让我在 DECLARE json VARCHAR(max);从#tempTable1中选择g进入json;当用该列的行填充 json 以便稍后使用 操作时

标签: sql json sql-server csv


【解决方案1】:

不清楚为什么要删除#tempTable1 中的列,尤其是当您在insert into Data 语句中进一步引用列ef 时:

ALTER TABLE #tempTable1 
    DROP COLUMN a, b, c, d, e, f, h, i;

如果以下语法正确,它仍然只会为单行选择 g 的值:

DECLARE @json varchar (max);
SELECT g INTO @json FROM #tempTable1; 

不要尝试对@json 值进行操作,而是尝试直接使用类似以下的方式对#tempTable1 中的数据进行操作:

insert into Data (G_1, G_2, E, F)
  select G_1, G_2, E, F
  from #tempTable1
  cross apply openjson(g) with (
    G_1 varchar(50) '$."Personal Information Type".value',
    G_2 varchar(100) '$."Purpose".value'
  );

【讨论】:

  • 最后一个问题。如果一个键有几个项目,例如“更改类型”:[“一”,“二”,“三”],我如何访问每个项目并将其插入不同的板?到目前为止,我所做的是一个计数器和一个 while 循环,以 $ 的形式访问它。"Change Type"[@count]
  • 你可能想问一个不同的问题,但它类似于cross apply openjson(g, '$."Change Type"') with (ChangeType nvarchar(10) '$')
  • 这部分为我服务,因为如果我想访问不在该路径中的元素的其余关键元素,我不能
  • 您不仅限于单个openjson() 呼叫。您可以根据需要堆叠任意数量的cross apply(如果匹配一个或多个)或outer apply(如果匹配零个或多个)。这是我昨天回答的different SO question 的一个例子。
  • 几个cross apply的链接的响应对我有用,但是我运行了6次,我不知道为什么。我有 3 个项目,例如 "Change Type": ["one", "two", "three"],总共我必须输入 3 个值(表中的行),它会执行 18 次(行)。这对我来说似乎很奇怪,因为我不知道数字 6 是从哪里来的
猜你喜欢
  • 2020-05-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-15
  • 2017-01-01
  • 2023-03-21
  • 1970-01-01
相关资源
最近更新 更多