我有一个处于明确定义模式模式的 Cosmos 数据库。我有一个 Synapse Serverless SQL 实例。我在 Cosmos 中有一些文档,其中的对象包含具有空值的字段。当我在 SQL 中为容器创建视图时,空对象值显示为 0,为什么会这样做?
示例:
这是 Cosmos 中的文档(对象以黄色突出显示,字段为空):
当我从无服务器 SQL 池中的 cosmos db 读取文档时,我遇到了同样的问题,如下所示:
AddressDetails
中的空值被替换为0。这表明SQL Server引擎(或OPENROWSET使用的底层JSON解析器)正在将line1、line2和邮政编码解释为数字字段(可能是整数),如下所示:
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。您可以得到如下所示的输出: