MS Sql Server OPENJSON 功能有问题

如何解决MS Sql Server OPENJSON 功能有问题?

我在下面为这个问题创建了一个 sql 测试脚本。

 IF OBJECT_ID('tempdb..#temp') IS NOT NULL
    DROP TABLE #temp;

CREATE TABLE #temp
(
    Id INT NOT NULL PRIMARY KEY,Attributes NVARCHAR(MAX) NULL
);

INSERT INTO #temp (Id,Attributes)
VALUES (1,'[{"Name":"Step","Value":"A"},{"Name":"State","Value":"Active"}]');
INSERT INTO #temp (Id,Attributes)
VALUES (2,"Value":"B"},"Value":"Inactive"}]');
INSERT INTO #temp (Id,Attributes)
VALUES (3,'[{"Name":"State",Attributes)
VALUES (4,"Value":"D"}]');

SELECT
    t.Id,t.Attributes,stepname.Value AS [Step],statename.Value AS [State]
FROM #temp t
    CROSS APPLY
    OPEnjsON(t.Attributes)
    WITH
    (
        Name NVARCHAR(MAX) '$.Name',Value NVARCHAR(MAX) '$.Value'
    ) AS stepname
    CROSS APPLY
    OPEnjsON(t.Attributes)
    WITH
    (
        Name NVARCHAR(MAX) '$.Name',Value NVARCHAR(MAX) '$.Value'
    ) AS statename
WHERE 1 = 1
      --AND (stepname.Name = statename.Name)     -- A
      --AND                                      -- B
      --(                                        -- B
      --    stepname.Name IS NULL                -- B
      --    OR stepname.Name = 'Step'            -- B
      --)                                        -- B
      --AND                                      -- B
      --(                                        -- B
      --    statename.Name IS NULL               -- B
      --    OR statename.Name = 'State'          -- B
      --);                                       -- B

按原样运行此脚本会产生以下输出

ID 属性 步骤 状态
1 [{"Name":"Step","Value":"Active"}] A A
1 [{"Name":"Step","Value":"Active"}] A 活跃
1 [{"Name":"Step","Value":"Active"}] 活跃 A
1 [{"Name":"Step","Value":"Active"}] 活跃 活跃
2 [{"Name":"Step","Value":"Inactive"}] B B
2 [{"Name":"Step","Value":"Inactive"}] B 无效
2 [{"Name":"Step","Value":"Inactive"}] 无效 B
2 [{"Name":"Step","Value":"Inactive"}] 无效 无效
3 [{"Name":"State","Value":"Active"}] 活跃 活跃
4 [{"Name":"Step","Value":"D"}] D D

我希望在输出中看到的只有 4 行,每个数据行一个

ID 属性 步骤 状态
1 [{"Name":"Step","Value":"Active"}] A 活跃
2 [{"Name":"Step","Value":"Inactive"}] B 无效
3 [{"Name":"State","Value":"Active"}] 活跃
4 [{"Name":"Step","Value":"D"}] D

我在示例中留下了一些注释代码,以查看我尝试过但无济于事的事情的类型。用 '-- A' 取消注释 where 语句让我更接近,但不完全。我确信用'-- B' 取消注释 where 子句中的语句会给我我想要的,但事实并非如此。关于如何做到这一点的任何想法?

我最初只使用 1 个 OPEnjsON 块但没有成功,所以我认为也许有 2 个 OPEnjsON 块,一个用于 Step 一个用于 State 会有所帮助,但仍然无法获得第 3 行和第 4 行数据因为这些行中的每一行都缺少 2 个 JSON 值之一。

非常感谢您的帮助!

解决方法

可以使用条件聚合:

SELECT
    t.Id,t.Attributes,[Step] = MAX(CASE WHEN stepname.Name = 'Step' THEN stepname.Value END),[State] = MAX(CASE WHEN statename.Name = 'State' THEN statename.Value END) 
FROM #temp t
CROSS APPLY OPENJSON(t.Attributes) WITH (
        Name NVARCHAR(MAX) '$.Name',Value NVARCHAR(MAX) '$.Value'
    ) AS stepname
CROSS APPLY OPENJSON(t.Attributes) WITH (
        Name NVARCHAR(MAX) '$.Name',Value NVARCHAR(MAX) '$.Value'
    ) AS statename
GROUP BY t.Id,t.Attributes
ORDER BY t.Id;

db<>fiddle demo

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

其他编程问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?