创建JSON数据收集SQL函数时遇Operand should contain 1column(s)错误
问题分析与解决方案
核心错误原因
- WHERE子句语法错误:你写的
('JSON_EXTRACT', r.data, c.name)不是有效的布尔条件,JSON_EXTRACT是函数,需要正确调用并给出判断逻辑,比如检查提取结果是否非空。 - 单行变量无法存储多行结果:
SELECT ... INTO @myList如果查询返回多条记录,单个VARCHAR变量无法容纳,会触发"Operand should contain 1column(s)"类错误。 - 返回类型不匹配:函数声明返回
boolean,但实际需求是收集JSON数据,返回类型与功能完全不符。
修正后的代码示例(MySQL环境)
CREATE FUNCTION returnRecord() RETURNS VARCHAR(1000) DETERMINISTIC BEGIN DECLARE myList VARCHAR(1000); -- 用GROUP_CONCAT拼接多行结果为单个字符串,避免赋值报错 SELECT GROUP_CONCAT( JSON_UNQUOTE(JSON_EXTRACT(r.data, CONCAT('$.', c.name))) SEPARATOR ', ' ) INTO myList FROM records r JOIN columns c ON r.view_id = c.view_id -- 过滤提取结果为空的记录,排除无效数据 WHERE JSON_EXTRACT(r.data, CONCAT('$.', c.name)) IS NOT NULL; RETURN myList; END;
关键修改说明
- JSON函数正确调用:
JSON_EXTRACT(r.data, CONCAT('$.', c.name))用于从r.data的JSON结构中提取对应c.name字段的值,$.是JSON路径的根节点标识;JSON_UNQUOTE用于去除提取结果的引号,得到纯文本值。 - 多行结果处理:通过
GROUP_CONCAT将所有符合条件的JSON值拼接成逗号分隔的字符串,适配单行变量存储。 - 返回类型调整:将返回类型改为
VARCHAR(1000)(可根据实际数据长度调整),匹配数据收集的需求。 - 过滤无效数据:WHERE子句添加非空判断,排除无法提取到值的记录。
若需返回多行数据(表值函数,MySQL)
如果不需要拼接成字符串,而是直接返回每行的JSON提取值,可创建表值函数:
CREATE FUNCTION returnRecord() RETURNS TABLE (extracted_value VARCHAR(255)) DETERMINISTIC RETURN ( SELECT JSON_UNQUOTE(JSON_EXTRACT(r.data, CONCAT('$.', c.name))) AS extracted_value FROM records r JOIN columns c ON r.view_id = c.view_id WHERE JSON_EXTRACT(r.data, CONCAT('$.', c.name)) IS NOT NULL );
内容的提问来源于stack exchange,提问作者Martin Bozhinov
相关产品推荐
相关产品推荐

