Как ДОБАВИТЬ, ЕСЛИ ЕЩЕ, ЕСЛИ в хранимых процедурах MYSQL, ГДЕ ОКАЗЫВАЕТСЯ, чтобы не запускать И внутри ГДЕ, когда параметр НЕДЕЙСТВИТЕЛЕН - PullRequest
0 голосов
/ 05 декабря 2018
DELIMITER $

CREATE PROCEDURE filing_route(IN appl_name varchar(500),
IN granted char(1),
IN oppose tinyint(4),
IN beginDate date,
IN endDate date,
IN ipc varchar(300))
BEGIN

DROP TABLE IF EXISTS total_company_applications;
DROP TABLE IF EXISTS family_aggregate;
DROP TABLE IF EXISTS tmp_filing_route;
DROP TABLE IF EXISTS tmp_filing_route2;

IF (granted IS NOT NULL AND oppose IS NOT NULL AND beginDate IS NOT NULL AND endDate IS NOT NULL AND ipc IS NOT NULL) THEN
    CREATE TEMPORARY TABLE IF NOT EXISTS total_company_applications AS
    (SELECT distinct a.appln_id FROM sample.tls201_appln a
    INNER JOIN sample.tls207_pers_appln b ON b.appln_id = a.appln_id
    INNER JOIN sample.tls906_person c ON c.person_id = b.person_id
    INNER JOIN sample.tls209_appln_ipc d ON d.appln_id = a.appln_id
    WHERE c.psn_name LIKE CONCAT(appl_name, '%')
    AND a.granted LIKE granted
    AND a.isOpposed = oppose
    AND a.appln_filing_date BETWEEN beginDate and endDate
    AND FIND_IN_SET(d.ipc_class_symbol, ipc));
ELSE IF(oppose IS NOT NULL AND beginDate IS NOT NULL AND endDate IS NOT NULL AND ipc IS NOT NULL) THEN
    CREATE TEMPORARY TABLE IF NOT EXISTS total_company_applications AS
    (SELECT distinct a.appln_id FROM sample.tls201_appln a
    INNER JOIN sample.tls207_pers_appln b ON b.appln_id = a.appln_id
    INNER JOIN sample.tls906_person c ON c.person_id = b.person_id
    INNER JOIN sample.tls209_appln_ipc d ON d.appln_id = a.appln_id
    WHERE c.psn_name LIKE CONCAT(appl_name, '%')
    AND a.granted LIKE granted
    AND a.isOpposed = oppose
    AND a.appln_filing_date BETWEEN beginDate and endDate
    AND FIND_IN_SET(d.ipc_class_symbol, ipc));

CREATE TEMPORARY TABLE IF NOT EXISTS family_aggregate AS 
(SELECT b.docdb_family_id, b.appln_auth, b.receiving_office, MIN(b.appln_filing_date) as first_date 
FROM total_company_applications a
INNER JOIN tls201_appln b ON b.appln_id = a.appln_id 
WHERE b.appln_filing_year < 9999
GROUP BY b.docdb_family_id, b.appln_auth, b.receiving_office
ORDER BY b.docdb_family_id, first_date);

CREATE TEMPORARY TABLE IF NOT EXISTS tmp_filing_route AS (
SELECT docdb_family_id, first_date, group_concat(distinct appln_auth, IF(appln_auth = 'WO', CONCAT(' (RO = ', receiving_office, ')'), '') ORDER BY appln_auth DESC separator ', ') as filing_route 
FROM family_aggregate
GROUP BY docdb_family_id, first_date);

CREATE TEMPORARY TABLE IF NOT EXISTS tmp_filing_route2 AS (
SELECT docdb_family_id, group_concat(filing_route ORDER BY first_date separator ' -> ') as filing_route
FROM tmp_filing_route
GROUP BY docdb_family_id);

SELECT filing_route, COUNT(distinct docdb_family_id) as num_families
FROM tmp_filing_route2
GROUP BY filing_route
ORDER BY num_families DESC
LIMIT 20;


END$

У меня есть хранимая процедура filing_route. Я не хочу запускать строку с AND и параметром Where, если параметр имеет значение null.Я пробовал это

WHERE c.psn_name LIKE CONCAT(appl_name, '%')
IF(granted IS NOT NULL)
    AND a.granted LIKE granted
END IF
AND a.isOpposed = oppose

Но это не работает.Могу ли я получить предложения о том, как сделать случаи по умолчанию, если параметр не задан или пуст.Если я сделаю предыдущий обходной путь, то сделайте комбинацию для всех 5 случаев.Я должен построить 2 ^ 5 = 64 случая, чтобы проверить. Есть ли более умный способ сделать это.

1 Ответ

0 голосов
/ 05 декабря 2018

Для вопроса

Нет, я хочу знать, как я могу добавить И, только если параметр существует

Вы можете попробовать ниже, просто используйте IF(), ключевым моментом является ситуация, когда условие не соответствует, просто добавьте 1=1, чтобы сделать синтаксис sql правильным

WHERE c.psn_name LIKE CONCAT(appl_name, '%')
  AND a.isOpposed = oppose
  AND IF(granted IS NOT NULL,a.granted LIKE granted,1=1)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...