【问题标题】:Split a JSON type data into different columns将 JSON 类型的数据拆分为不同的列
【发布时间】:2020-09-11 11:02:19
【问题描述】:

我从以下参数中得到一个值:

{ "Line1":"Nav Place Road", "Line2":"Nyork City", "Line3":"USA 34576" }

我希望它显示如下:

ColumnName  Value
---------------------------
Line1       Nav Place Road
Line2       Nyork City
Line3       USA 34576

如何在不使用 JSON 函数的情况下解析它?

【问题讨论】:

  • 你试过什么?你在哪里卡住了?我们来这里是为了协助而不是全力以赴。

标签: sql json sql-server tsql sql-server-2012


【解决方案1】:

在 v2016 之前,没有原生 JSON 支持。

但是您的格式可以相对容易地转换为 XML...

DECLARE @YourJson NVARCHAR(MAX) = N'{ "Line1":"Nav Place Road", "Line2":"Nyork City", "Line3":"USA 34576" }';

SELECT x.value('@name','nvarchar(max)') AS TheName
      ,x.value('@value','nvarchar(max)') AS TheValue
FROM (VALUES(CAST(CONCAT('<x name=',REPLACE(REPLACE(REPLACE(REPLACE(@YourJson,'{',''),'}',''),':"',' value="'),', "','/> <x name="'),' />') AS XML))) A(Casted)
CROSS APPLY Casted.nodes('/x') B(x);

简而言之:

我们使用简单的字符串方法将您的 JSON 转换为:

<x name="Line1" value="Nav Place Road" />
<x name="Line2" value="Nyork City" />
<x name="Line3" value="USA 34576" />

这可以使用原生 XML 支持读取。

注意:如果您的值可能包含逗号,或者如果空格处处不同,则需要更深入地思考......

【讨论】:

    【解决方案2】:

    这应该很简单:

    declare @js nvarchar(1000) = '{ "Line1":"Nav Place Road", "Line2":"Nyork City", "Line3":"USA 34576" }';
    
    SELECT t.[Key] columnName, t.[Value] FROM OPENJSON(@js, '$') t;
    

    Demo on DB Fiddle

    列名 |价值 :--------- | :------------- 1号线 |导航广场路 线2 |纽约市 3号线 |美国 34576

    【讨论】:

    • GMB 我想他想在 SQL Server 2012 中做。此功能仅在 2017 年及以上版本可用。
    • 我正在使用 SQL Server 2012。收到错误“无效对象 JSON”
    猜你喜欢
    • 1970-01-01
    • 2020-08-13
    • 1970-01-01
    • 1970-01-01
    • 2017-11-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多