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

创建JSON数据收集SQL函数时遇Operand should contain 1column(s)错误

问题分析与解决方案

核心错误原因

  1. WHERE子句语法错误:你写的('JSON_EXTRACT', r.data, c.name)不是有效的布尔条件,JSON_EXTRACT是函数,需要正确调用并给出判断逻辑,比如检查提取结果是否非空。
  2. 单行变量无法存储多行结果:SELECT ... INTO @myList如果查询返回多条记录,单个VARCHAR变量无法容纳,会触发"Operand should contain 1column(s)"类错误。
  3. 返回类型不匹配:函数声明返回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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 21:15:33