5

我需要编写一个布尔逻辑解析器,它将布尔逻辑语言转换为 SQL WHERE 子句。

操作数的顺序总是正确的(右边有值)。

这是一个相对简单的例子。可能有嵌套括号和使用 NOT 运算符等。

(CACOUNT=01 OR CACOUNT=02 OR CACOUNT=03)
 AND Q4=1 AND NAME=TIMOTHY

这就是 WHERE 子句的样子。

WHERE (
     EXISTS (
       SELECT 1 FROM MyVerticalTable b
       WHERE b.Key=a.Key AND b.Key='CACOUNT' AND b.Value='01'
     )
  OR EXISTS (
       SELECT 1 FROM MyVerticalTable b
       WHERE b.Key=a.Key AND b.Key='CACOUNT' AND b.Value='02'
  )
  OR EXISTS (
       SELECT 1 FROM MyVerticalTable b
       WHERE b.Key=a.Key AND b.Key='CACOUNT' AND b.Value='03'
  )
)
AND EXISTS (
       SELECT 1 FROM MyVerticalTable b
       WHERE b.Key=a.Key AND b.Key='Q4' AND b.Value='1'
)
AND EXISTS (
       SELECT 1 FROM MyVerticalTable b
       WHERE b.Key=a.Key AND b.Key='NAME' AND b.Value='TIMOTHY'
)
4

3 回答 3

2

好吧,WHERE 之后是布尔表达式,所以你需要用简单的替换来翻译,而不是解析。对于您的示例,您只需在末尾加上引号:NAME='TIMOTHY'

于 2010-05-19T17:33:40.250 回答
1

为该语言编写语法并创建递归下降解析器。这是解析简单“语言”(例如布尔表达式)的最简单方法。

将其解析为 AST(抽象语法树)后,您就可以进行任何必要的转换并生成 SQL WHERE 子句。

于 2010-05-19T18:01:00.763 回答
0

编辑后一切都变了。你仍然不需要火箭科学。编写一个正则表达式,例如:(\w+)=([\w\d]+),然后将每个匹配项替换为

EXISTS (
       SELECT 1 FROM MyVerticalTable b
       WHERE b.Key=a.Key AND b.Key='\1' AND b.Value='\2'
)
于 2010-05-20T10:24:57.707 回答