You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Cosmos DB查询嵌套对象属性报找不到meterValues别名错误如何解决

问题诱因
  • CData ODBC Driver for Cosmos DB 不支持直接通过表别名.嵌套对象.子属性的点语法访问JSON嵌套属性,驱动会将点分隔的meterValues识别为独立表别名,而非m对应文档下的嵌套字段,因此抛出“找不到meterValues别名”的报错。
  • 现有查询存在额外语法错误:SQL中不能使用<> null判断非空,null值的判断必须使用IS NOT NULL/IS NULL语法,否则该条件会永远返回false,无法过滤出有效数据。
  • 你之前仅能查询到首个对象子属性的问题,本质也是嵌套属性访问语法不规范导致的驱动解析异常。
修正方案

最简便的修改方式是使用驱动支持的JSON_VALUE函数提取嵌套属性,修改后的完整代码如下:

cnxn: pyodbc.Connection = pyodbc.connect(
"""DRIVER={CData ODBC Driver for Cosmos DB};
   AccountEndpoint=x;
   AccountKey=y;""")
# 调整后的查询语句
query_sql = """
SELECT 
    m.id, 
    m.deviceUID, 
    m.time, 
    JSON_VALUE(m.meterValues, '$.eairo') AS eairo
FROM metering m 
WHERE m.deviceUID IS NOT NULL
"""
df = pd.read_sql_query(query_sql, cnxn)

如果需要同时提取meterValues下的多个子属性,可使用OPENJSON批量展开嵌套对象,减少重复调用JSON_VALUE:

SELECT 
    m.id, 
    m.deviceUID, 
    m.time, 
    mv.eairo,
    mv.cio
FROM metering m
CROSS APPLY OPENJSON(m.meterValues)
WITH (
    eairo BIGINT '$.eairo',
    cio INT '$.cio'
) AS mv
WHERE m.deviceUID IS NOT NULL

以上两种写法均可正确提取所有文档下meterValues的子属性,覆盖全部符合条件的数据。

内容的提问来源于stack exchange,提问作者Matt

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 06:06:04