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 に答える