SQL中JSON_VALUE返回NULL问题:如何提取JSON数组中的address字段值
解决JSON_VALUE提取字段返回NULL的问题
嘿,我来帮你揪出问题所在!先拆解下你存储的JSON结构:
{"DisplayCommandList":[{"address":"10 Test Avenue","dwelling":true}]}
这里的DisplayCommandList是一个数组(注意外层的方括号[]),而非单个JSON对象——这就是你所有语句返回NULL的核心原因!
分析你写的错误路径
$.DisplayCommandList.address:直接给数组DisplayCommandList调用address属性,但数组本身没有这个属性,必须先定位到数组里的具体元素$.DisplayCommandList.address[0]:路径顺序完全搞反了,应该先取数组的第0个元素,再访问它的address,而不是反过来$.DisplayCommandList.address[1]/$.DisplayCommandList.address[2]:不仅路径顺序错误,你的数组里只有1个元素,就算路径正确,索引1、2本身不存在,自然返回NULL
正确的提取方式
你其实已经写对了一个路径$.DisplayCommandList[0].address,但如果还是返回NULL,大概率是因为存储的JSON是HTML转义后的格式(比如你给出的{"DisplayCommandList":[{"address":"10 Test Avenue","dwelling":true}]}),JSON_VALUE无法解析这种带"的转义字符串,得先替换成正常的双引号:
SELECT JSON_VALUE(REPLACE([Result], '"', '"'), '$.DisplayCommandList[0].address') FROM Table;
如果数据库里存储的已经是正常无转义的JSON,直接用$.DisplayCommandList[0].address就能正确提取10 Test Avenue。
提取数组中所有address的扩展方案
如果DisplayCommandList数组可能包含多个元素,想要批量提取所有address值,可以用OPENJSON遍历数组:
SELECT j.address FROM Table CROSS APPLY OPENJSON([Result], '$.DisplayCommandList') WITH ( address NVARCHAR(100) '$.address' ) j;
这样不管数组里有几个元素,所有的address都会被列出来。
内容的提问来源于stack exchange,提问作者Michael
相关产品推荐
相关产品推荐

