2016-01-19 2 views
1

У меня есть конкретный запрос, что я уверен, что это не тривиально, но подумал о том, чтобы спросить на всякий случай. Если у меня есть какой-либо запрос с WHERE условием:AlaSQL: Как добраться до opperands

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

Я хотел бы знать все операнды, которые принимают участие в WHERE, в этом случае ['a', 'b', 'a->fn(b->c)', 0].

Причина в том, что я хотел бы отслеживать эти значения, и если какие-либо изменения, то я бы просто переоценил запрос.

ответ

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 

Является ли это ответ на ваш вопрос?

+1

Да, это именно то, что мне нужно. –

 Смежные вопросы

  • Нет связанных вопросов^_^