有没有办法在 SQL Server 中查询 JSON 列而忽略键的大小写?

问题描述 投票:0回答:5

我正在尝试查询具有混合大小写的 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

我错过了任何具有大写键的行。有什么方法可以查询所有行而忽略其大小写吗?

sql sql-server json azure
5个回答
7
投票

也许你可以降低 json:

COUNT(JSON_VALUE (lower(SRQuestions.value), '$.id'))  AS Question_Specific_Id

5
投票

根据 MS 的说法,看起来您遇到了区分大小写的查询:

当 OPENJSON 解析 JSON 数组时,该函数返回以下索引 JSON文本中的元素作为键。+ 用于匹配的比较 具有 JSON 表达式属性的路径步骤是 区分大小写且不区分排序规则(即 BIN2 比较)。 https://learn.microsoft.com/en-us/sql/t-sql/functions/openjson-transact-sql

如果唯一的变化在于第一个字符的大写,您可以尝试通过使用变体和

UNION
一起创建查询来解决此限制。


2
投票

您可以使用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
投票

老问题,但我在谷歌搜索类似问题时遇到了这个问题,所以我将提出我的解决方案:

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 来过滤结果。


0
投票

我发现这比提供的其他一些方法更好:

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

这效果更好,因为只要路径的初始大小写正确,它就允许结果的大小写正确。

© www.soinside.com 2019 - 2024. All rights reserved.