【问题标题】:Using sub queries to create JSON file使用子查询创建 JSON 文件
【发布时间】:2020-09-17 11:41:06
【问题描述】:

我正在尝试为我目前正在研究的一个新项目创建一个 JSON 文件,我的大部分工作都按预期工作,但我现在正处于尝试使用子查询的地步为了正确格式化 JSON。

我尝试使用以下子查询,但 SQL 不喜欢这种格式。

`选择

'Admin User TEST ONLY PLEASE IGNORE' AS AdditionalNotes


(
   SELECT v.atFault 
   FROM dbo.ic_DP_AX ax
   CROSS APPLY (VALUES (ax.Acc_fault1), (ax.Acc_fault2)) v (atFault)
   FOR JSON AUTO
   ) AS InsuredPartyClaims,
   (
   SELECT Acc_fault3 AS atFault 
   FROM dbo.ic_DP_AX
   FOR JSON AUTO
   ) AS InsuredPartyConvictions
FOR JSON PATH) ROOT('InsuredParties')



FROM

    dbo.icp_Daprospect AS p INNER JOIN
    dbo.icp_Dapolicy AS d ON p.Branch@ = d.Branch@ AND p.ClientRef@ = 
 d.ClientRef@ LEFT OUTER JOIN
    dbo.ic_DP_AX AS  ax ON P.Branch@ = ax.B@ AND ax.PolRef@ = d.PolicyRef@ 
LEFT OUTER JOIN
WHERE 
    d.PolicyRef@ = '' AND
    d.Branch@ = 0`

对于 JSON 路径

我想要达到的输出是:

"InsuredParties": [
    {
        "InsuredPartyClaims": [
            {
                "atFault": false
            },
            {
                "atFault": true
            }
        ],
        "InsuredPartyConvictions": [ 
           {
                "atFault": false
           },
           

谁能看到我做错了什么?我试图让这个尽可能简单。

【问题讨论】:

  • 你好安德鲁!乍一看,我认为您需要在 CROSS APPLY 之后使用 SELECT 语句。 SELECT x FROM y CROSS APPLY (SELECT x FROM z WHERE ID = ID) as A。您实际上是在进行内部连接,因此您需要在 CROSS APPLY 中使用 SELECT 语句。不确定这是否会有所帮助,但 CROSS APPLY mssqltips.com/sqlservertip/1958/… 上的一些参考资料@

标签: json sql-server subquery for-json


【解决方案1】:

没有样本数据总是很困难,但愚蠢的例子是一个可能的解决方案:

表:

CREATE TABLE dbo.ic_DP_AX (Acc_fault1 bit, Acc_fault2 bit, Acc_fault3 bit)
INSERT INTO dbo.ic_DP_AX (Acc_fault1, Acc_fault2, Acc_fault3)
VALUES (0, 1, 0)

声明:

SELECT
   (
   SELECT v.atFault 
   FROM dbo.ic_DP_AX ax
   CROSS APPLY (VALUES (ax.Acc_fault1), (ax.Acc_fault2)) v (atFault)
   FOR JSON AUTO
   ) AS InsuredPartyClaims,
   (
   SELECT Acc_fault3 AS atFault 
   FROM dbo.ic_DP_AX
   FOR JSON AUTO
   ) AS InsuredPartyConvictions
FOR JSON PATH, ROOT('InsuredParties')   

结果:

{
  "InsuredParties":[
    {
      "InsuredPartyClaims":[
        {
          "atFault":false
        },
        {
          "atFault":true
        }
      ],
      "InsuredPartyConvictions":[
        {
          "atFault":false
        }
      ]
    }
  ]
}

【讨论】:

  • 不幸的是,我在两个 FOR JSON AUTO 语句中也遇到了语法错误
  • @AndrewBarnard 答案中的陈述是一个工作示例。如果可能,请发布您的尝试。
  • 我刚刚修改了我的原始帖子以包含完整的查询
【解决方案2】:

子查询也需要返回 JSON。

试试

(
  (SELECT ax.Acc_fault1 AS [atFault] FROM dbo.ic_DP_AX AS ax FOR JSON PATH) AS [PartyClaims]
  (SELECT ax.Acc_fault2 AS [atFault] FROM dbo.ic_DP_AX AS ax FOR JSON PATH) AS [PartyClaims]
  (SELECT ax.Acc_fault3 AS [atFault] FROM dbo.ic_DP_AX AS ax FOR JSON PATH) AS [PartyConvictions]
) FOR JSON PATH AS [InsuredParties]

【讨论】:

  • 不幸的是,当我尝试使用它时,它会显示语法错误。
猜你喜欢
  • 2020-11-22
  • 2018-08-13
  • 2021-06-10
  • 2017-01-17
  • 1970-01-01
  • 2021-07-29
  • 1970-01-01
  • 2019-10-12
  • 2021-12-25
相关资源
最近更新 更多