Я должен записать синтаксический анализатор булевой логики, который переведет язык булевой логики в оператор 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'
)
ну, то, что идет после WHERE, является логическим выражением, поэтому вам нужен перевод с простыми заменами, а не парсинг. для вашего образца вам просто нужно поставить цитаты в конце: NAME='TIMOTHY'
Напишите грамматику для языка и создайте синтаксический анализатор с рекурсивным спуском. Это самый простой способ разобрать простые «языки», такие как логическое выражение.
После того, как вы проанализировали его в своем AST (абстрактном синтаксическом дереве), вы можете выполнить любые необходимые преобразования и сгенерировать предложение SQL WHERE.
после редактирования все изменилось. вам все еще не нужна ракетостроение. напишите регулярное выражение, что-то вроде: (\w+)=([\w\d]+), затем замените каждое совпадение на
EXISTS (
SELECT 1 FROM MyVerticalTable b
WHERE b.Key=a.Key AND b.Key='\1' AND b.Value='\2'
)