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

JavaScript如何将操作符操作数数组拼接为MySQL查询字符串

JavaScript实现嵌套逻辑结构转MySQL查询条件字符串

问题背景

正在开发基于JavaScript的MySQL查询语句生成工具,通过独立输入框分别录入操作符与操作数,当前使用的测试示例数组如下:

var array = [ "OR", ["<", "col1", "col2"], [ "AND", ["==", "col3", "col4"], ["!=", "colx", "coly"]]];
var array2 = [ "OR", ["<", "col1", "col2"], [ "AND", ["==", "col3", "col4"], ["!=", "colx", "coly"], ["<", "colo", "othercol"]]];

预期生成的查询条件字符串如下:

"col1 < col2 OR (col3 == col4 AND colx != coly)"
"col1 < col2 OR (col3 == col4 AND colx != coly AND colo < othercol)"

现有实现的缺陷

当前编写的createString函数仅做了单层遍历,没有处理嵌套递归逻辑,也没有实现复合逻辑块自动加括号的规则,无法输出符合预期的结果,现有代码如下:

function createString(array) {
    var string = '';
    for(var i = 0; i < array.length; i++) {
        if(Array.isArray(array[i])) {
            if(array[i].length == 3) {
                var operator = array[i][0];
                var variable1 = array[i][1];
                var variable2 = array[i][2];
                string+= variable1+operator+variable2;
            }
        }else {
            string+=array[i];
        }
    }
    return string;
}

实现思路

传入的数组是标准的嵌套表达式树结构,靠单层循环没法处理多层嵌套,必须用递归逐层解析,核心规则如下:

  • 先判断节点类型:如果数组长度为3、且第一个元素不是AND/OR,就是普通二元比较表达式,直接按「左操作数 操作符 右操作数」格式拼接即可
  • 如果数组第一个元素是AND/OR,就是逻辑运算块:先把后面所有子节点逐个递归解析成字符串,再用当前逻辑运算符把所有子串拼接起来
  • 只有最外层(根节点)的逻辑运算块不需要加括号,所有嵌套在内层的逻辑块,拼接完成后都要在外层包一层括号,保证运算优先级和预期一致
  • 所有运算符和操作数之间留空格,符合常规SQL书写格式

可运行实现代码

function createString(node, isRoot = true) {
  // 处理普通二元比较表达式
  if (node.length === 3 && !['AND', 'OR'].includes(node[0])) {
    return `${node[1]} ${node[0]} ${node[2]}`;
  }

  // 处理逻辑运算节点
  const op = node[0];
  const childNodes = node.slice(1);
  const parsedChildren = childNodes.map(child => createString(child, false));
  const joinedStr = parsedChildren.join(` ${op} `);

  // 根节点无需加括号,内层逻辑块包裹括号
  return isRoot ? joinedStr : `(${joinedStr})`;
}

// 测试用例
console.log(createString(array));
// 输出:col1 < col2 OR (col3 == col4 AND colx != coly)
console.log(createString(array2));
// 输出:col1 < col2 OR (col3 == col4 AND colx != coly AND colo < othercol)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 22:06:22