1

我有一个具体的要求,我很确定这不是微不足道的,但为了以防万一,我想问一下。如果我有任何WHERE条件查询:

SELECT * FROM table1 WHERE a = b AND a->fn(b->c) > 0

WHERE在这种情况下,我想知道参与的所有操作数['a', 'b', 'a->fn(b->c)', 0]

原因是我想跟踪这些值,如果有任何变化,我就会重新评估查询。

4

1 回答 1

3

您可以使用alasql.parse()函数从 SQL 语句生成抽象语法树。要从语句WHERE子句打印部分树,SELECT请使用:

var ast = alasql.parse('SELECT * FROM table1 WHERE a = b AND a->fn(b->c) > 0');
console.log(ast.statements[0].where);

然后你会看到树状结构。

{"expression":
   {"left":
       {"left": {"columnid":"a"},"op":"=", "right":{"columnid":"b"}},
     "op":"AND",
     "right":{"left":
                  {"left":{"columnid":"a"},
                   "op":"->",
                   "right":
                        {"funcid":"fn","args":[
                          {"left":{"columnid":"b"},
                           "op":"->",
                           "right":"c"}
                         ]}},
              "op":">",
              "right":{"value":0}}}}

你可以沿着这棵树走来收集所有的论据。每个节点都是 yy.xxx 类型的对象,所以可以测试一下:

if(node instanceof yy.Column) // then process as the column

这是您的问题的答案吗?

于 2016-01-19T11:00:37.020 回答