我需要编写一个布尔逻辑解析器,它将布尔逻辑语言转换为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'
)
答案 0 :(得分:2)
嗯,在WHERE之后是布尔表达式,因此您需要使用简单替换进行翻译,而不是解析。对于您的样本,您只需要在末尾加上引号:NAME ='TIMOTHY'
答案 1 :(得分:1)
为语言编写语法并创建递归下降解析器。这是解析简单“语言”的最简单方法,例如布尔表达式。
一旦将其解析为AST(抽象语法树),就可以进行必要的转换并生成SQL WHERE子句。
答案 2 :(得分:0)
编辑完所有内容后。你还是不需要火箭科学。写一个正则表达式,如:(\ w +)=([\ w \ d] +),然后用
替换每个匹配EXISTS (
SELECT 1 FROM MyVerticalTable b
WHERE b.Key=a.Key AND b.Key='\1' AND b.Value='\2'
)