PL SQL нечеткий поиск с предложением - PullRequest
0 голосов
/ 03 апреля 2019

Я работаю над поисковым запросом в колл-центре. Если пользователь вводит фамилию и водительские права, я должен найти наиболее близких подходящих клиентов из базы данных. Я использую нечеткий поиск soundex () для сравнения фамилии клиента. Основываясь на различных условиях, я должен продолжать использовать функцию soundex, это влияет на производительность. Я пытаюсь использовать With Clause, но так как у меня много частей IF и ELSE, это дает исключение для таблицы или представления.

Я попытался в Google найти способ использования с предложением и с предложением с функцией, ни один из них не помог.

PROCEDURE RetrieveCustomer
(
      i_lastname          IN varchar,
      i_DL             IN varchar, 
      o_cursor            OUT     T_CURSOR
)  
IS
      v_DLAndExactLastNameCnt        Number; 
      v_DLAndLastNameCnt             Number;
      v_DLCnt                        Number;      
  BEGIN

     SELECT COUNT(*) INTO v_DLAndExactLastNameCnt
     FROM   t1, t2
     WHERE t1.DL = i_DL AND (upper(t2.last_name) like upper(i_lastname));

     IF(v_DLAndExactLastNameCnt > 0) THEN
        OPEN o_cursor FOR
            select
              a,
              b,
              'DL + ELN' as search_result_baseon --exact last name match
        from t1, t2, t3, t4
        where t1.DL = i_DL AND (upper(t2.last_name) like upper(i_lastname));

     ELSE
         SELECT COUNT(*) INTO v_DLAndLastNameCnt
         FROM   t1, t2
         WHERE t1.DL= i_DL
               AND p.last_name in (select last_name from t2 where soundex(last_name) = soundex(i_lastname));                                 

          IF(v_DLAndLastNameCnt > 0) THEN   
            OPEN o_cursor FOR                 
                select 
                       a,
                     b,
                     'DL + LN' as search_result_baseon -- last name not exact match
                from t1, t2, t3, t4 
                where
                     t1.DL= i_DL
                     AND p.last_name in (                          
                            select last_name from t2 where soundex(last_name) = soundex(i_lastname)
                                                );                                   
           ELSE
              SELECT COUNT(*) INTO v_DLCnt
               FROM   t1
               WHERE  t1.DL = i_DL;
               IF(v_DLCnt > 0) THEN
                  OPEN o_cursor FOR                 
                   select a
                              b,
                          'DL' as search_result_baseon 
                  from t1, t2, t3, t4
                  where t1.DL = i_DL;

                ELSE
                    OPEN o_cursor FOR                 
                        select 
                          a,
                          b,                          
                          'LN' as search_result_baseon 
                  from t1, t2, t3, t4
                  where t2.last_name IN ( 
                              select last_name from t2 where soundex(last_name) = soundex(i_lastname)
                           )
                 END IF;               
             END IF;                                                
       END IF;  

  END RetrieveCustomer;

Можно ли как-нибудь сохранить соответствующую запись фамилии в некоторой таблице в памяти и использовать ее, как и когда требуется в этой процедуре? Может кто-нибудь из вас, пожалуйста, предложите мне лучший способ написать мою процедуру:

...