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

时间:2017-10-24 16:34:26

标签: sql sql-server json azure

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

我想念任何有大写键的行。有没有办法查询忽略大小写的所有行?

4 个答案:

答案 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