Azure Cosmos Synapse Link - SQL 中对象内的空字段默认为 0

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

我有一个处于明确定义模式模式的 Cosmos 数据库。我有一个 Synapse Serverless SQL 实例。我在 Cosmos 中有一些文档,其中的对象包含具有空值的字段。当我在 SQL 中为容器创建视图时,空对象值显示为 0,为什么会这样做?

示例:

这是 Cosmos 中的文档(对象以黄色突出显示,字段为空):

Cosmos

Synapse View

Synapse Query

azure azure-cosmosdb azure-synapse azure-cosmosdb-sqlapi
1个回答
0
投票

当我从无服务器 SQL 池中的 cosmos db 读取文档时,我遇到了同样的问题,如下所示:

enter image description here

AddressDetails
中的空值被替换为0。这表明SQL Server引擎(或OPENROWSET使用的底层JSON解析器)正在将line1、line2和邮政编码解释为数字字段(可能是整数),如下所示:

enter image description here

0 是他们的默认值。这可能就是得到上述格式的

AddressDetails
的原因。您可以使用以下查询根据需要转换
AddressDetails
字段:

SELECT 
    JSON_QUERY(
        CONCAT(
            '{"line1":', 
            CASE WHEN JSON_VALUE(AddressDetails, '$.line1') <> '0' THEN JSON_VALUE(AddressDetails, '$.line1') ELSE 'null' END, 
            ',"line2":', 
            CASE WHEN JSON_VALUE(AddressDetails, '$.line2') <> '0' THEN JSON_VALUE(AddressDetails, '$.line2') ELSE 'null' END, 
            ',"postcode":', 
            CASE WHEN JSON_VALUE(AddressDetails, '$.postcode') <> '0' THEN JSON_VALUE(AddressDetails, '$.postcode') ELSE 'null' END, 
           
            '}'
        )
    ) AS AddressDetails_Transformed
FROM OPENROWSET(
    PROVIDER = 'CosmosDB',
    CONNECTION = 'Account=csmsdbs;Database=db',
    OBJECT = 'c1',
    SERVER_CREDENTIAL = 'MyCosmosDbAccountCredential'
) AS [c1];
  • JSON_VALUE
    :使用 JSON 路径 (
    AddressDetails
    ) 从
    $.fieldName
    列中提取各个 JSON 字段。
  • CASE
    逻辑
    :将
    0
    替换为
    null
  • CONCAT
    :将 JSON 对象构造为字符串。
  • JSON_QUERY
    :确保结果被视为有效的 JSON。

您可以得到如下所示的输出:

enter image description here

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