我正在尝试查询具有混合大小写的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
我想念任何有大写键的行。有没有办法查询忽略大小写的所有行?
答案 0 :(得分:1)
根据MS,看起来你遇到了一个区分大小写的查询:
当OPENJSON解析JSON数组时,该函数返回索引 JSON文本中的元素作为键。+用于匹配的比较 具有 JSON表达式属性的路径步骤 区分大小写和整理 - 不知道(即BIN2比较)。 https://docs.microsoft.com/en-us/sql/t-sql/functions/openjson-transact-sql
如果第一个字符的大小写只有唯一的变体,您可以尝试使用变体创建查询并将UNION
结果放在一起来解决此限制。
答案 1 :(得分:1)
您可以使用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”也可以。
答案 2 :(得分:1)
古老的问题,但在搜寻类似问题时遇到了这个问题,因此我将提出解决方案:
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过滤结果。
答案 3 :(得分:-1)
也许您可以降低json:
COUNT(JSON_VALUE (lower(SRQuestions.value), '$.id')) AS Question_Specific_Id