2014-09-05 81 views
-1

我有一个字循环逐字串的问题。我会输入字符串“苏丹中国美国非洲”,我有查询表有3行苏丹,中国,美国。因此,我需要写入PL/SQL函数,该函数将循环输入字符串“苏丹中国美国非洲”,从右到左(在这种情况下,非洲到苏丹)每个单词,并尝试从查找表中找到匹配,并找到任何匹配词(右边的第一个词,在本例中是USA),它将停止循环并返回单词(USA)。因此总结一下,我们必须逐字从一个输入字符串的右到左循环,并返回查找表中可用的第一个匹配字。在PL/SQL中循环遍历字

+0

背后从右到左搜索单词的原因是什么?你是否试图解决你的问题?你能用当前的进度发布你的代码吗? – yamny 2014-09-05 07:44:05

+0

目前我在使用instr函数查找字符串中第一次出现任何关键字。因为它在远程机器上,我无法共享我现有的代码。 – Sid 2014-09-05 07:51:03

回答

1

这可以通过单个SQL查询来完成,例如,

WITH mydata AS 
    (SELECT 1 AS id, 'Sudan China USA Africa' AS string FROM dual 
    UNION ALL 
    SELECT 2  , 'China Europe Sudan Asia'   FROM dual 
) 
    , lookup AS 
    (SELECT 'Sudan' AS word FROM dual 
    UNION ALL 
    SELECT 'China' FROM dual 
    UNION ALL 
    SELECT 'USA' FROM dual 
) 
SELECT t.id 
    , max(t.word) KEEP (DENSE_RANK LAST ORDER BY t.pos) lastword 
FROM (SELECT mydata.id 
      , pos.column_value AS pos 
      , regexp_substr(mydata.string, '([^ ])+', 1, pos.column_value) AS word 
     FROM mydata 
      CROSS JOIN 
      TABLE 
       (CAST 
        (MULTISET 
        (SELECT level 
        FROM dual 
        CONNECT BY level <= regexp_count(mydata.string, '([^ ])+') 
        ) AS sys.odciNumberList 
       ) 
      ) pos) t 
    INNER JOIN lookup l 
     ON (t.word = l.word) 
GROUP BY t.id 

     ID LASTWORD    
---------- ----------------------- 
     1 USA      
     2 Sudan     
1
declare 

function searchWord(inputString in varchar2) return varchar2 
is 

TYPE arrayWord IS TABLE OF VARCHAR2(32767) INDEX BY PLS_INTEGER; 
word arrayWord; 
tmpStr varchar2(32767); 
i  pls_integer := 0; 
tmp  number; 
begin 
tmpStr := inputString; 
loop 
    word(i) := (substr(tmpStr,1, instr(tmpStr,' ')-1)); 
    tmpStr := substr(tmpStr, instr(tmpStr,' ')+1); 
    if instr(tmpStr,' ') = 0 then 
    i := i+1; 
    word(i):= tmpStr; 
    exit; 
    end if; 
    i := i+1; 
end loop; 

if word.count > 0 then 
    for i in reverse word.first..word.last 
    loop 
    select count(*) into tmp from t1 t where t.word = word(i) and rownum = 1; 
    if tmp != 0 then 
     return word(i); 
    end if; 
    end loop; 
end if; 
return null; 

end searchWord; 

begin 
dbms_output.put_line(searchWord('Sudan China USA Africa')); 
end;