2010-05-19 7 views
5

J'ai besoin d'écrire un analyseur logique booléen qui traduira le langage logique booléen en une clause SQL WHERE.Comment analyser la logique booléenne?

L'ordre des opérandes sera toujours dans le bon ordre (avec la valeur sur la droite).

Voici un exemple relativement simple. Il pourrait y avoir des parenthèses imbriquées et l'utilisation de NOT, etc.

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

Voici ce que la clause WHERE ressemblerait.

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

Ca ne peut pas simplement aller dans une clause 'WHERE' tel quel? – tzaman

+0

Non, il ne peut vraiment pas du tout. Il n'y a pas de colonne nommée CACOUNT. C'est une table verticale. –

+0

Qu'est-ce qu'une table verticale? – Andrey

Répondre

2

Bien, ce qui va après WHERE est une expression booléenne, vous avez donc besoin de traduction avec des remplacements simples, pas d'analyse. Pour votre exemple, vous devez simplement mettre des citations à la fin: NAME = 'TIMOTHY'

+0

Cela ne marchera pas aussi facilement –

1

Écrivez une grammaire pour la langue et créez un analyseur de descente récursif. C'est la manière la plus simple d'analyser des "langages" simples tels qu'une expression booléenne. Une fois que vous l'avez analysé dans votre AST (arborescence de syntaxe abstraite), vous pouvez effectuer toutes les transformations nécessaires et générer la clause SQL WHERE.

+0

Faire l'analyseur de descente récursif est l'endroit où j'ai le plus de problèmes; Spécifiquement avec des parenthèses –

+0

Faites d'abord votre [grammaire] (http://en.wikipedia.org/wiki/Extended_Backus%E2%80%93Naur_Form). Une fois que votre grammaire est complète, l'analyseur de descente récursif est simple. –

+0

Comment puis-je transformer ma grammaire en code C#? –

0

après tout modifier modifié. vous n'avez toujours pas besoin de science de fusée. écrire une expression régulière, quelque chose comme: (\ w +) = ([\ w \ d] +), puis remplacer chaque match par

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