Как найти прагматически условие SQL WHERE - PullRequest
0 голосов
/ 19 февраля 2020

Я создал API-шлюз, который будет принимать оператор SQL, запускать оператор для базы данных и возвращать его результат в качестве ответа. Для каждого оператора SQL, который я получаю в качестве входных данных, я должен добавить условие WHERE в SQL. Например: -

Ввод SQL - ВЫБРАТЬ * ИЗ КОНТАКТОВ, ГДЕ last_name = 'Johnson';

Добавить условие- страна = ' Индия '

Новый SQL - ВЫБРАТЬ * ИЗ КОНТАКТОВ, ГДЕ last_name =' Джонсон 'И (страна =' Индия ');

Для вышеупомянутых SQL было легко найти ключевое слово WHERE и его состояние, как оно было в конце. Но для некоторых SQL у нас может быть OFFSET, HAVING, ORDER BY, GROUP BY, FETCH NEXT и многие другие после WHERE. Таким образом, невозможно найти надежный способ выяснить условие WHERE и добавить к нему.

Возможное использование WHERE приведено ниже -

SELECT *                          // Condition With Spaces
FROM contacts
WHERE last_name = 'Johnson';      

SELECT *                          // Condition Without Spaces
FROM contacts
WHERE last_name='Johnson';    


SELECT *                          // Multiple Conditions
FROM suppliers
WHERE ((state = 'Florida' AND supplier_name = 'IBM')
OR (supplier_id > 5000)) AND       


SELECT email FROM emailTable       // WHERE With OFFSET
WHERE user_id=3
ORDER BY Id
OFFSET 10 ROWS
FETCH NEXT 10 ROWS ONLY;     


SELECT column_name(s)            // WHERE With GROUP BY, HAVING, ORDER BY  
FROM table_name
WHERE condition
GROUP BY column_name(s)
HAVING condition
ORDER BY column_name(s); 

Один подход будет быть в списке всех ключевых слов, которые идут после WHERE, чтобы найти его условие. Но я хочу проверить, есть ли лучший подход для этого. Любые предложения или документы будут оценены.

1 Ответ

3 голосов
/ 19 февраля 2020

Использовать подзапросы:

select q.*
from (<query>) q  -- insert query here
<where>           -- insert other code here

Итак, этот запрос становится:

SELECT q.*
FROM (SELECT * 
      FROM contacts
     ) q
WHERE last_name = 'Johnson';  

Если вы обнаружите, что вам также необходимо добавить ORDER BY / OFFSET, я бы рекомендуем передавать это как отдельный аргумент - как вы делаете с WHERE.

...