我有一个以 Json 格式存储数据的 SQL 表。我正在使用下面的示例数据来理解这个问题。每种文档类型都有自己的 JSON 结构。
DocumentID DocumentTypeID Status JsonData
----------------------------------------------------------------------------
1 2 Active {"FirstName":"Foo","LastName":"Bar","States":"[OK]"}
2 2 Active {"FirstName":"James","LastName":"Smith","States":"[TX,NY]"}
3 3 Active {"Make":"Ford","Model":"Focus","Year":"[2020]"}
4 3 Active {"Make":"Tesla","Model":"X","Year":"[2012,2015,2019]"}
然后我有另一个 JSON 需要在 Where 条件下使用
@Condition = '{"FirstName": "James",LastName:"Smith","States":[TX]}'
我也会有DocumentTypeID
作为参数
因此,在普通 sql 中,如果我对属性名称进行硬编码,则 SQL 看起来像
SELECT * FROM Documents d
WHERE
d.DocumentTypeID = @DocumentTypeID AND
JSON_VALUE(d.JsonData,'$.FirstName') = JSON_VALUE(@Condition,'$.FirstName') AND
JSON_VALUE(d.JsonData,'$.LastName') = JSON_VALUE(@Condition,'$.LastName') AND
JSON_QUERY(d.JsonData,'$.States') = JSON_QUERY(@Condition,'$.States') -- This line is wrong. I have
-- to check if one array is
-- subset of another array
给定列
中的属性名称,并将与给定的 DocumentTypeID 完全匹配。JsonData
Condition
我已经有另一个存储 DocumentType 及其属性的 SQL 表。如果有帮助,我可以为每个可在上述查询中使用的属性存储 json 路径,以动态构造 where 条件
DocumentTypeID PropertyName JsonPath DataType
---------------------------------------------------------------------------------
2 FirstName $.FirstName String
2 LastName $.LastName String
2 States $.States Array
3 Make $.Make String
3 Model $.Model String
3 Year $.Year Array
ISSUE
对于每种文档类型,@condition 将具有不同的 JSON 结构。我如何构建动态 where 条件?这在 SQL 中甚至可能吗?
我正在使用 C#.NET,所以我想在 C# 中构建 SQL 查询并执行 SQL 查询。但在我走那条路之前,我想检查一下它是否可以在 TSQL 中做到这一点