我正在尝试查询具有混合大小写的 JSON 列。例如,某些行的键全部为小写,如下所示:
{"name":"Screening 1","type":"template","pages":[{"pageNumber":1,...}
但是,某些行的键的第一个字母大写,如下所示:
{"Type":"template","Name":"Screening2","Pages":[{"PageNumber":1,...}
不幸的是,SQL Server 似乎只支持区分大小写的 JSON 路径系统。因此,我无法成功查询所有行。如果我在如下查询中使用像“$.pages”这样的小写路径:
SELECT ST.Id AS Screening_Tool_Id
, ST.Name AS Screening_Tool_Name
, ST.Description AS Screening_Tool_Description
, COUNT(JSON_VALUE (SRQuestions.value, '$.id')) AS Question_Specific_Id
FROM dbo.ScreeningTemplate AS ST
CROSS APPLY OPENJSON(ST.Workflow, '$.pages') AS SRPages
CROSS APPLY OPENJSON(SRPages.Value, '$.sections') AS SRSections
我错过了任何具有大写键的行。有什么方法可以查询所有行而忽略其大小写吗?
也许你可以降低 json:
COUNT(JSON_VALUE (lower(SRQuestions.value), '$.id')) AS Question_Specific_Id
根据 MS 的说法,看起来您遇到了区分大小写的查询:
当 OPENJSON 解析 JSON 数组时,该函数返回以下索引 JSON文本中的元素作为键。+ 用于匹配的比较 具有 JSON 表达式属性的路径步骤是 区分大小写且不区分排序规则(即 BIN2 比较)。 https://learn.microsoft.com/en-us/sql/t-sql/functions/openjson-transact-sql
如果唯一的变化在于第一个字符的大写,您可以尝试通过使用变体和
UNION
一起创建查询来解决此限制。
您可以使用openjson。而不是
JSON_VALUE (SRQuestions.value, '$.id')
你可以写
(select Value
from openjson( SRQuestions.value )
where [Key] collate latin1_general_ci = 'id')
您必须在此处使用不区分大小写的“_ci”排序规则。如果数据库使用 CI 排序规则,“UTF8_General_CI”也可以,“database_default”也可以。
老问题,但我在谷歌搜索类似问题时遇到了这个问题,所以我将提出我的解决方案:
SELECT @pb = PB from
OPENJSON(@PropertyBagsAsJson, '$."$values"')
WITH (
PbId1 nvarchar(MAX) 'lax $.Id',
PbId2 nvarchar(MAX) 'lax $.id',
PB nvarchar(MAX) '$' AS JSON
)
WHERE COALESCE(PbId1,PbId2) = @PropertyBagId
我希望这个例子是清楚的。基本上我只是添加属性的所有可能的大小写,然后使用 Coalesce 来过滤结果。
我发现这比提供的其他一些方法更好:
Coalesce(JSON_VALUE(@JsonData, 'lax $."propertyA"'),--Use expected case, result will be in proper case if successful
JSON_VALUE(lower(@JsonData), 'lax $."propertya"')) --NOTE: Use all lowercase for path - result will also be in lowercase
这效果更好,因为只要路径的初始大小写正确,它就允许结果的大小写正确。