c# - 对 JSON 数据进行 SQL LIKE 查询

标签 c# json sql-server linq-to-sql

我有 JSON 数据(无架构)存储在 SQL Server 列中,需要对其运行搜索查询。

例如(非实际数据)

[
 {
   "Color":"Red",
   "Make":"Mercedes-Benz"  
 },
 {
   "Color":"Green",
   "Make":"Ford"  
 },
]

SQL Server 2017 具有 JSON_XXXX 方法,但它们适用于预先已知的架构。就我而言,对象的模式没有精确定义并且可能会改变。

当前要搜索的列,例如找到品牌=梅赛德斯-奔驰。我使用搜索短语“%\”Make\”:\“Mercedes-Benz\”%”。如果使用精确的品牌名称,则效果非常好。我希望用户也能够使用部分名称进行搜索,例如只需输入“Benz”或“merc”即可。

是否可以使用适合我的通配符构建 SQL 查询?还有其他选择吗?

最佳答案

一种可能的方法是使用带有默认架构的 OPENJSON 两次。使用默认架构,OPENJSON returns包含列 keyvaluetype 的表,您可以将它们用于 WHERE 子句。

表:

CREATE TABLE #Data (
   Json nvarchar(max)
)
INSERT INTO #Data
   (Json)
VALUES
   (N'[
 {
   "Color":"Red",
   "Make":"Mercedes-Benz"  
 },
 {
   "Color":"Green",
   "Make":"Ford",
   "Year": 2000
 }
]')

声明:

SELECT 
   j1.[value]
   -- or other columns 
FROM #Data d
CROSS APPLY OPENJSON(d.Json) j1
CROSS APPLY OPENJSON(j1.[value]) j2
WHERE 
   j2.[key] LIKE '%Make%' AND
   j2.[value] LIKE '%Benz%'

输出:

--------------------------
value
--------------------------
{
   "Color":"Red",
   "Make":"Mercedes-Benz"  
 }

关于c# - 对 JSON 数据进行 SQL LIKE 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57135701/

相关文章:

C#类列表之间的区别

c# - 随机洗牌 listBox 项目 C#

javascript - 如何将值数组作为键分配给另一个值数组?

sql-server - 嵌套 IF ELSE 的可行 T-SQL 替代方案,用于 CASE 失败的比较

sql - 如何在SSRS表达式中检索当前月份

sql-server - 在 Visio 中对我的数据库进行逆向工程时无法添加 View

c# Reporting Services -- ReportParameter 值不是字符串

javascript - 如何将小文本文件的内容加载到 javascript var wo/JQuery 中?

javascript - 反转存储在 javascript 变量中的 JSON 数组

c# - 需要在 HttpWebResponse 中访问 HttpOnly cookie