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
相关产品推荐
相关产品推荐

