Как я анализирую булеву логику?

Я должен записать синтаксический анализатор булевой логики, который переведет язык булевой логики в оператор Where SQL.

Порядок операндов всегда будет в правильном порядке (со значением справа).

Вот относительно простой пример. Могли быть вложенные круглые скобки и использование операторов 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'
)
5
задан Nic Foster 15 April 2015 в 19:02
поделиться

3 ответа

ну, то, что идет после WHERE, является логическим выражением, поэтому вам нужен перевод с простыми заменами, а не парсинг. для вашего образца вам просто нужно поставить цитаты в конце: NAME='TIMOTHY'

2
ответ дан 15 December 2019 в 06:18
поделиться

Напишите грамматику для языка и создайте синтаксический анализатор с рекурсивным спуском. Это самый простой способ разобрать простые «языки», такие как логическое выражение.

После того, как вы проанализировали его в своем AST (абстрактном синтаксическом дереве), вы можете выполнить любые необходимые преобразования и сгенерировать предложение SQL WHERE.

1
ответ дан 15 December 2019 в 06:18
поделиться

после редактирования все изменилось. вам все еще не нужна ракетостроение. напишите регулярное выражение, что-то вроде: (\w+)=([\w\d]+), затем замените каждое совпадение на

EXISTS (
       SELECT 1 FROM MyVerticalTable b
       WHERE b.Key=a.Key AND b.Key='\1' AND b.Value='\2'
)
0
ответ дан 15 December 2019 в 06:18
поделиться
Другие вопросы по тегам:

Похожие вопросы: