sql-server - 从 sql 查询制作 json

标签 sql-server json algorithm typescript

我有以下场景:

class question {
    idQuestion: string;
    question: string;
    type: string;
}

class options {
    idOption: string;
    option: string;
}

我的 SQL 返回:

idquestion question type idoption option

即:

question1 foo? textbox null null
question2 bar? select option1 aaa
question2 bar? select option2 bbb
question3 foobar? radio option1 aaa
question3 foobar? radio option2 bbb
question3 foobar? radio option3 ccc

我想将 SQL 响应映射到以下接口(interface):

questionOptions{
    question: Question;
    options: Option[];
}

我怎样才能让它成为可能?所以最后,我可以得到一个问题列表,每个问题都包含其选项。

P.S:从sql数据库中关联问题和选项会不会是更好的选择?

编辑:

我想从示例数据中获取以下 json:

[
  {
    idQuestion: "question1",
    question: "foo?",
    options: []
  },
  {
    idQuestion: "question2",
    question: "bar?"
    options: [
      {
        idOption: "option1",
        option: "aaa"
      },
      {
        idOption: "option2",
        option: "bbb"
      },
    ]
  }
]

最佳答案

我有一个辅助函数,它几乎可以将任何行/数据集转换为 JSON 字符串/数组。

假设 2012+

Declare @YourData table (idQuestion varchar(50),question varchar(50), type varchar(50),idOption varchar(50),[option] varchar(50))
Insert Into @YourData values
('question1','foo?','textbox', null, null),
('question2','bar?','select','option1','aaa'),
('question2','bar?','select','option2','bbb'),
('question3','foobar?','radio','option1','aaa'),
('question3','foobar?','radio','option2','bbb'),
('question3','foobar?','radio','option3','ccc')


Declare @JSON varchar(max) = ''
Select @JSON=@JSON+','+String
 From  (
        Select String=Replace(B.JSON,'}',',"options":'+IsNull(C.JSON,'[]')+'}')
         From (Select Distinct idquestion,question From @YourData) A
         Cross Apply (Select JSON=[dbo].[udf-Str-JSON](0,0,(Select A.idQuestion,A.question  for XML RAW))) B
         Cross Apply (Select JSON=[dbo].[udf-Str-JSON](0,0,(Select idOption,[option] from @YourData Where idquestion=A.idquestion  for XML RAW))) C
       ) A

Select '['+Stuff(@JSON,1,1,'')+']'

返回

enter image description here

UDF

CREATE FUNCTION [dbo].[udf-Str-JSON] (@IncludeHead int,@ToLowerCase int,@XML xml)
Returns varchar(max)
AS
Begin
    Declare @Head varchar(max) = '',@JSON varchar(max) = ''
    ; with cteEAV as (Select RowNr     =Row_Number() over (Order By (Select NULL))
                            ,Entity    = xRow.value('@*[1]','varchar(100)')
                            ,Attribute = xAtt.value('local-name(.)','varchar(100)')
                            ,Value     = xAtt.value('.','varchar(max)') 
                       From  @XML.nodes('/row') As R(xRow) 
                       Cross Apply R.xRow.nodes('./@*') As A(xAtt) )
          ,cteSum as (Select Records=count(Distinct Entity)
                            ,Head = IIF(@IncludeHead=0,IIF(count(Distinct Entity)<=1,'[getResults]','[[getResults]]'),Concat('{"status":{"successful":"true","timestamp":"',Format(GetUTCDate(),'yyyy-MM-dd hh:mm:ss '),'GMT','","rows":"',count(Distinct Entity),'"},"retults":[[getResults]]}') ) 
                       From  cteEAV)
          ,cteBld as (Select *
                            ,NewRow=IIF(Lag(Entity,1)  over (Partition By Entity Order By (Select NULL))=Entity,'',',{')
                            ,EndRow=IIF(Lead(Entity,1) over (Partition By Entity Order By (Select NULL))=Entity,',','}')
                            ,JSON=Concat('"',IIF(@ToLowerCase=1,Lower(Attribute),Attribute),'":','"',Value,'"') 
                       From  cteEAV )
    Select @JSON = @JSON+NewRow+JSON+EndRow,@Head = Head From cteBld, cteSum
    Return Replace(@Head,'[getResults]',Stuff(@JSON,1,1,''))
End
-- Parameter 1: @IncludeHead 1/0
-- Parameter 2: @ToLowerCase 1/0 (converts field name to lowercase
-- Parameter 3: (Select * From ... for XML RAW)

关于sql-server - 从 sql 查询制作 json,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40348360/

相关文章:

sql-server - SQL Server 2005 中的平均时间值

c# - 如何根据路径向 JSON 添加新的 JProperty?

c++ - 红黑树插入问题

algorithm - 复杂性理论-排序算法

sql-server - 命令在控制台中运行良好,但在 Powershell 使用时运行不佳

sql - 如何降低 SQL Server VIEW 的速度?

c# - EF 代码优先 - 超时已过。完成前超时时间已过

java - 在 gson 中解析动态 Json 对象

C# JSON 从 JavaScript 发布

algorithm - 将列表分成两等份算法