json - SQL JSON 乘以交叉应用
问题描述
我有以下代码,用于在 JSON 列的内容中搜索 id 值。该代码运行良好,在本例中返回 6 行。
SELECT log
FROM logs
CROSS APPLY OPENJSON([log], '$.tags') WITH (id INT '$.id')
WHERE id = 12
我尝试使用以下代码将搜索扩展到另一列
SELECT *
FROM logs
CROSS APPLY OPENJSON([log_x], '$.tags') WITH (id_x INT '$.id')
CROSS APPLY OPENJSON([log_y], '$.tags') WITH (id_y INT '$.id')
WHERE id_x = 1
这会在创建重复行时返回 16 个值。有谁知道如何在不创建重复项的情况下组合多个“交叉应用”?
下面是我用来创建表的一些示例代码
INSERT INTO A10000000075.dbo.Logs ([log_x], [log_y])
VALUES ('{"tags":[{"id_x":1,"x":99.12343123213,"y":88.123232},{"id_x":12,"x":99.12343123213,"y":88.123232},{"id_x":13,"x":99.12343123213,"y":88.123232}]}',
'{"tags":[{"id_y":1006,"x":99.12343123213,"y":88.123232},{"id_y":12,"x":99.12343123213,"y":88.123232},{"id_y":13,"x":99.12343123213,"y":88.123232}]}');
解决方案
请试试这个:
SELECT a.[id_x],a.[id_y]
FROM (
SELECT TRY_CONVERT(INT,JSON_VALUE(x.value,'$.id_x')) AS [id_x]
,TRY_CONVERT(INT,JSON_VALUE(y.value,'$.id_y')) AS [id_y]
FROM logs
CROSS APPLY OPENJSON([log_x], '$.tags') AS x
CROSS APPLY OPENJSON([log_y], '$.tags') AS y
WHERE x.[key] = y.[key]
) a
WHERE a.id_x = 1
;
推荐阅读
- java - 将按钮上的回收站视图滚动到特定位置
- mysql - 看不到将 nvarchar 转换和格式化为我所需的日期时间
- javascript - React & Mobx .map() 在 onChange 上不起作用
- node.js - 通过 https 代理的 https 请求,但返回“未知协议:openssl”错误
- python - 没有显示 Django 表单
- mysql - 如何在静态 IP 上第二次托管测试链接
- c++ - QString::utf16(): 是不是 UB?
- python - 使用正则表达式(在 python 中)获取数学表达式(单个字母、数字、方程式...)
- git - 如何从 git committ 中删除目录
- python - 使用虚拟云端硬盘获取 Google 云端硬盘文件链接