2010-05-19 14 views
5

Necesito escribir un analizador lógico booleano que traduzca el lenguaje lógico booleano a una cláusula SQL WHERE.¿Cómo analizo la lógica booleana?

El orden de los operandos siempre estará en el orden correcto (con valor a la derecha).

Aquí hay un ejemplo relativamente simple. Podría haber paréntesis anidados y el uso de NOT, etc.

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

Aquí es lo que la cláusula WHERE se parecería.

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' 
) 
+3

¿Esto no puede simplemente entrar en una cláusula 'WHERE' tal cual? – tzaman

+0

No, realmente no puede en absoluto. No hay una columna llamada CACOUNT. Es una mesa vertical. –

+0

¿qué es la tabla vertical? – Andrey

Respuesta

2

bien, lo que pasa por donde se lo expresión booleana, por lo que necesita de traducción con reemplazos simples, no el análisis. para su muestra solo necesita poner citas al final: NOMBRE = 'TIMOTHY'

+0

Esto no funcionará tan fácilmente –

1

Escriba una gramática para el idioma y cree un analizador de descenso recursivo. Esta es la forma más fácil de analizar "lenguajes" simples, como una expresión booleana.

Una vez que lo haya analizado en su AST (árbol de sintaxis abstracta), puede hacer las transformaciones necesarias y generar la cláusula WHERE de SQL.

+0

Hacer el analizador de descenso recursivo es donde estoy teniendo más problemas; específicamente con paréntesis –

+0

Haga su [gramática] (http://en.wikipedia.org/wiki/Extended_Backus%E2%80%93Naur_Form) primero. Una vez que su gramática está completa, el analizador de descenso recursivo es simple. –

+0

¿Cómo puedo convertir mi gramática en código C#? –

0

después de editar todo ha cambiado. todavía no necesitas ciencia de cohetes. escribir una expresión regular, algo así como: (\ w +) = ([\ w \ d] +), luego vuelva a colocar cada partido

EXISTS (
     SELECT 1 FROM MyVerticalTable b 
     WHERE b.Key=a.Key AND b.Key='\1' AND b.Value='\2' 
) 
Cuestiones relacionadas