【问题标题】:For JSON Path Formatting对于 JSON 路径格式
【发布时间】:2018-10-10 19:30:57
【问题描述】:

背景:

我有一个名为“问题”的 JSON nvarchar(max) 列,它看起来像单行中的这个真实示例...

{"211":0,"212":0,"213":0,"214":0,"215":0,"216":0,"217":0,"218":0,"219":0,"220":"1","221":"1","222":"1","223":"1","224":"1","225":"1","226":"1","227":"1","228":"1","229":"1","230":"1","231":"1","232":"1"}

我目前正在为示例“调用”生成此示例 JSON sn-p...

[
  {
    "call": {
      "id": 200643,
      "yes_answers": [
        {
          "question_id": "220"
        },
        {
          "question_id": "221"
        },
        {
          "question_id": "222"
        },
        {
          "question_id": "223"
        },
        {
          "question_id": "224"
        },
        {
          "question_id": "225"
        },
        {
          "question_id": "226"
        },
        {
          "question_id": "227"
        },
        {
          "question_id": "228"
        },
        {
          "question_id": "229"
        },
        {
          "question_id": "230"
        },
        {
          "question_id": "231"
        },
        {
          "question_id": "232"
        }
      ]
    }
  }
]

.. 使用这个查询...

select c.call_id as [call.id],
    (
        select x.[key]
        from [call].[triage_questions] tq
            cross apply openjson(questions, '$') as x
        where value = 1 and tq.call_id = c.call_id
        for json path
    ) as [call.yes_answers]
from [call].[dimension] c
where call_id = 200643
for json path

我的问题:

我不喜欢“yes_answers”数组的格式化方式。我想要更像这样的东西:

[
  {
    "call": {
      "id": 200643,
      "yes_answers": [
        220,
        221,
        222,
        223,
        224,
        225,
        226,
        227,
        228,
        229,
        230,
        231,
        232
      ]
    }
  }
]

这有效吗?还是我应该以不同的方式展开?还是直接离开?

我将使用 SQL 将“yes_answers”数组中的每个 question_id 引用到一个引用表,在该表中我正在寻找与该问题关联的真/假标志。如果这很重要,那么 JSON 此时不会离开 SQL。

编辑:

感谢@Tomato32,我认为this other question 帮助我离得足够近了。

我的查询现在看起来像这样...

select c.call_id as [call.id],
    json_query(replace(replace((
        select x.[key] as question_id
        from [call].[triage_questions] tq
            cross apply openjson(questions, '$') as x
        where value = 1 and tq.call_id = c.call_id
        order by x.[key]
        for json path
    ), N'{"question_id":', N''), '"}', '"')) as [call.yes_answers]
from [call].[dimension] c
where call_id = 200643
for json path

我生成的 JSON 看起来像这样......

[
  {
    "call": {
      "id": 200643,
      "yes_answers": [
        "220",
        "221",
        "222",
        "223",
        "224",
        "225",
        "226",
        "227",
        "228",
        "229",
        "230",
        "231",
        "232"
      ]
    }
  }
]

我无法摆脱 "yes_answers" 数组中 int 值周围的引号,但我认为这无关紧要,我不会在这上面浪费任何时间 :) 谢谢全部!!!

【问题讨论】:

  • 我认为您可以为此使用 STUFF 和 FOR XML PATH。
  • Tim,太好了,您自己找到了解决方案!您可以将此添加为答案并接受它。可能是你得到the self-learner-badge。将您的[key] 转换为INT 可能会有所帮助。 数字通常放在不带引号的 JSON 中...
  • 你检查我下面的答案了吗

标签: json sql-server tsql for-json


【解决方案1】:

我只更新了你的替换语句以去掉“[number]”中的引号,如下:-

select c.call_id as [call.id],
    json_query(replace(replace((
        select x.[key] as question_id
        from [call].[triage_questions] tq
            cross apply openjson(questions, '$') as x
        where value = 1 and tq.call_id = c.call_id
        order by x.[key]
        for json path
    ), N'{"question_id":"', N''), '"}', '')) as [call.yes_answers]
from [call].[dimension] c
where call_id = 200643
for json path

在我的测试中,输出如下:-

[{"call":{"id":200643,"yes_answers":[220,221,222,223,224,225,226,227,228,229,230,231,232]}}]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-09-10
    • 2012-04-19
    • 1970-01-01
    • 1970-01-01
    • 2014-11-20
    • 1970-01-01
    • 2019-04-06
    • 1970-01-01
    相关资源
    最近更新 更多