- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想从 Microsoft SQL Server 数据库中 JSON 字符串内的数组中提取信息。
如果我有一个这样的 JSON 对象:
CREATE TABLE myTable([Id] int, [JsonInfo] varchar(max));
INSERT INTO myTable ([Id], [JsonInfo])
VALUES (1,
'{
"$id": "1",
"Id": "32766177-18c7-4c2d-bbb5-02588a73ff72",
"Metadata": [
{
"Identifier": "Identifier1",
"Value": "aaa"
},
{
"Identifier": "Identifier2",
"Value": "bbb"
},
{
"Identifier": "Identifier3",
"Value": "ccc"
},
],
}'
);
我发现访问整个数组的唯一方法是:
SELECT Id, value AS Metadata
FROM myTable t
CROSS APPLY OPENJSON( JSON_QUERY(t.JsonInfo, '$.Metadata'))
为了访问数组中的信息,我执行了以下操作:
SELECT
JSON_VALUE(Metadata, '$.Identifier') AS Identifier,
JSON_VALUE(Metadata, '$.Value') AS Value
FROM
(SELECT Id, value AS Metadata
FROM myTable t
CROSS APPLY OPENJSON( JSON_QUERY(t.JsonInfo, '$.Metadata'))
);
我的结果是:
Identifier | Value
------------+--------
Identifier1 | aaa
Identifier2 | bbb
Identifier3 | ccc
结果我应该是:
Identifier1 | Identifier2 | Identifier3
------------+-------------+------------
aaa | bbb | ccc
不匹配记录的结果:
Identifier1 | Identifier2 | Identifier3 |Identifier4
------------+-------------+-------------+-----------
aaa | bbb | ccc | NULL
aaa | bbb | NULL | ddd
我知道我可以用 PIVOT 转置它,但对于这种情况来说似乎太复杂了。
最佳答案
注:您提供的 JSON 无效。我不得不为我的例子修改它。如果您的 JSON 示例是您的生产数据的样子,那么您还有其他问题需要解决。
最简单的方法是对您的数据进行 PIVOT,如下所示:
DECLARE @myTable TABLE ( [Id] INT, [JsonInfo] VARCHAR(MAX) );
INSERT INTO @myTable ( [Id], [JsonInfo] )
VALUES (1,
'{
"$id": "1",
"Id": "32766177-18c7-4c2d-bbb5-02588a73ff72",
"Metadata": [
{
"Identifier": "Identifier1",
"Value": "aaa"
},
{
"Identifier": "Identifier2",
"Value": "bbb"
},
{
"Identifier": "Identifier3",
"Value": "ccc"
},
{
"Identifier": "Identifier4",
"Value": ""
}
]
}'
);
SELECT
Id, md.*
FROM @myTable AS mt
OUTER APPLY (
SELECT * FROM (
SELECT Identifier, [Value] FROM OPENJSON ( JsonInfo, '$.Metadata' ) WITH (
Identifier VARCHAR(50) '$.Identifier',
[Value] VARCHAR(50) '$.Value'
)
) AS ids
PIVOT (
MAX ( [Value] ) FOR Identifier IN ( [Identifier1], [Identifier2], [Identifier3], [Identifier4] )
) AS pvt
) AS md;
退货
+----+-------------+-------------+-------------+-------------+
| Id | Identifier1 | Identifier2 | Identifier3 | Identifier4 |
+----+-------------+-------------+-------------+-------------+
| 1 | aaa | bbb | ccc | |
+----+-------------+-------------+-------------+-------------+
这种方法仅在您知道每个标识符的预期值和行数时才有效,而且我怀疑是否是您已经提到的情况
PIVOT
.因此,您将被迫使用动态 SQL 方法。
-- Declare a variable to hold the dynamic SQL statement.
DECLARE @sql VARCHAR(MAX) = ''; -- must be initialized as an empty string.
-- Using the SQL hack to append continuous rows to a variable, we can build a list
-- of column names and their values from your JSON.
SELECT
@sql = @sql + ', NULLIF ( ''' + md.[Value] + ''', '''' ) AS [' + md.Identifier + ']'
FROM @myTable AS mt
OUTER APPLY (
SELECT
Identifier, [Value]
FROM OPENJSON ( JsonInfo, '$.Metadata' ) WITH (
Identifier VARCHAR(50) '$.Identifier',
[Value] VARCHAR(50) '$.Value'
) AS ids
) AS md
WHERE mt.Id = 1; -- <= note the record restriction.
-- Complete the dynamic SQL statement by adding SELECT and trimming
-- off the prefixed ", " from the column/value list by using STUFF.
SET @sql = 'SELECT ' + STUFF ( @sql, 1, 2, '' ) + ';';
-- Execute the dynamic statement.
EXEC ( @sql );
退货
+-------------+-------------+-------------+-------------+
| Identifier1 | Identifier2 | Identifier3 | Identifier4 |
+-------------+-------------+-------------+-------------+
| aaa | bbb | ccc | NULL |
+-------------+-------------+-------------+-------------+
如果您要
PRINT
已完成
@sql 你会看到的变量:
SELECT NULLIF ( 'aaa', '' ) AS [Identifier1], NULLIF ( 'bbb', '' ) AS [Identifier2], NULLIF ( 'ccc', '' ) AS [Identifier3], NULLIF ( '', '' ) AS [Identifier4];
希望这有助于您继续前进。
关于SQL JSON_VALUE/JSON_QUERY 从数组转为行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62711645/
我使用 POI4XPages api 从 Word 文档创建了 PDF。这是代码: var template = poiBean.buildResourceTemplateSource(null,"p
我如何转换它: SELECT max(id), value FROM GROUP BY value; 能言善辩吗? 提前致谢!! 最佳答案 这应该可行,您可以在 https://laravel.co
我有Jquery点击事件,并且我想在执行我的函数UpdateItemStatus(this.id);之前防止多次点击,所以我已尝试使用开/关事件的以下代码, $('#tableItems').on('
有谁知道有什么软件包支持以下将base58转换为十六进制字符串或从十六进制字符串转换为base58编码的相反方式。下面是一个 python 实现的示例。 https://www.reddit.com/
我正在使用 Rob Monies 的“Jquery Week Calendar”来构建日历应用程序。 我有一个 MSSQL 数据库,其中包含名为“dates”的表和以下字段: ID开始结尾标题 我想用
我有一个以下形式的字典 >>> {'1' : [V3210 , 234567 ,1235675 , 23], '2' : [v3214 , 5678 ,65879 ,89} , ...} 如何将字典写
我有一堆 one 形式的变量, two , three , four_five我想把它们转到getOne , getTwo , getThree , getFourFive ... 我写了一个公式来实
这是我的第一个问题,我是初学者,代码是用 C (ANSI C) 编写的。 代码应该为递归函数中的每个数字返回数字 (n+1)。(123 -> 234; 801->912; 239->340) 问题是当
这可能是一个愚蠢的问题,但是我很难找到我需要的答案。我有一个计算中继器的测试。我想返回 count 变量,以便我可以将其传递给另一个测试以在 for 循环中使用。 我尝试过的: this.counts
我有这个字符串列表: private final List categoryList = Arrays.asList("27", "28, 96", "10", "15", "7", "98"); 从
我正在使用互操作将 excel 文件转换为 pdf。我有一个工作代码。 但在将其保存为 pdf 之前。它会提示一个对话框,要求用户“是否保存对文件的更改”我怎样才能避免这个提示? 保存完成后如何关闭e
我有一个 Canvas ,我想将其转换并显示在标签中。我知道我们可以使用 toDataURL() 和 toBlob() 将 Canvas 转换为图像,但这两种方法都给我 base64 数据,这不是图像
我有一个获取用户 profilePicture、lblUsername 和 lblEmail 的 Facebook 登录名。我知道 FBProfilePictureView 是一个包含 UIImage
我正在尝试使用 grunt-webfont 从 SVG 生成网络字体. 问题是我需要这个任务在 windows 和 linux 机器上有效。为了实现这一点,我需要使用 doesn’t work wit
我使用的是我在 GitHub 上发现的一个 JS 插件,它使视频标题出现视差,问题是当我运行它响应手机时视频变黑,我试图在响应模式下将视频更改为图像。 我尝试使用@mediatag 但无法正常工作。
我正在尝试学习 Go 并研究降雨强度工具。对于此工具,我必须进行如下计算: var intensity float32 intensity = 10^((value−109)÷32) 值是一个 uin
我有一个看起来像这样的字符串,例如 Lübeck Nürnberg Österreich 和“Umlaute”。 现在我想拆分它并在字符串上添加新的“单词”,如下所示Lübeck Nürnberg Ö
我的任务: 通过 ffmpeg 将 YUV Frame 数据转换为 jpeg 图像。 我有的: 每个平面的数据和每个平面的线尺寸; 我试图创建空的 AVFrame 并用这些信息填充它的数据和行大小,但
使用 Reflex-DOM,我想做一个 Event t ()当浏览器准备好绘制下一帧时触发,即 requestAnimationFrame火灾。我试过这样: {-# LANGUAGE Recursiv
我有一条路线 Route::post('/updateLogo', 'CaptivePortalController@updateLogo'); 然后我在这里发布 $http({ method
我是一名优秀的程序员,十分优秀!