rem Finding Countries with matrix as ( select rownum seq , lower(column_value) txt from table ( word_list( 'FYYHNRD' , 'RLJCINU' , 'AAWAAHR' , 'NTKLPNE' , 'CILFSAP' , 'EOGOTPN' , 'EOGOTPN' , 'HPOLAND' ) ) ) , cells as ( select distinct seq, col , substr(txt, col, 1) cell from matrix cross join ( select rownum col from matrix ) ) , direction as ( select distinct sign(rownum - 2) dir from ( select count(*) from dual group by cube (1,2) ) ) , directions as ( select h.dir hor , v.dir ver , case h.dir when 1 then 'left' when -1 then 'right' end horizontal , case v.dir when -1 then 'down' when 1 then 'up' end vertical from direction h inner join direction v on ( not (h.dir=0 and v.dir=0) ) ) , words as ( select column_value word from table( word_list('italy', 'holland' , 'poland' ,'france' ,'canada', 'japan','india','china','togo','peru' ) ) ) select seq + ver * (length(word)-1) "Starting at row" , col + hor * (length(word)-1) " and Column " , horizontal "Going" , vertical " " , cast(word as varchar2(25)) "you will find the word" from ( select distinct cell , seq , col , hor , ver , sys_connect_by_path(cell,'*') p , word , horizontal , vertical from ( select c1.* , hor , ver , horizontal , vertical from cells c1 cross join directions ) cross join words start with cell = substr(words.word,1,1) connect by prior col-hor = col and prior seq-ver = seq and prior hor = hor and prior ver = ver and level < length(words.word)+1 and cell = substr(words.word, level,1) ) where translate(p,'Q*','Q') = word / rem Now finding hot IT terminology with matrix as ( select rownum seq , lower(column_value) txt from table ( word_list( 'NKFGBLSPENECULYJ' , 'LDJHEADSTARTSSCT' , 'FNAJPEGGCRNCETPA' , 'JFQTCTWXAJNACRHB' , 'KZGNAFGPADOXAUOL' , 'KDIFWBAVMSLRFTRE' , 'TRDGKCAERZEKRSAS' , 'PALZHSZSCNPMEBCP' , 'FRNECKJYELBTVGLA' , 'NPWRHNXANXIWRLEC' , 'PNIMTIYMVTMPEGKE' , 'BPPMMLYPBACNSGWK' , 'TJVKLPRMLQSFAEGP' , 'BCETNOWEBSERVICE' , 'LCGKTTGTXAJAANLZ' , 'GJDEVELOPERNJTLN' ) ) ) , cells as ( select distinct seq, col , substr(txt, col, 1) cell from matrix cross join ( select rownum col from matrix ) ) , direction as ( select distinct sign(rownum - 2) dir from ( select count(*) from dual group by cube (1,2) ) ) , directions as ( select h.dir hor , v.dir ver , case h.dir when 1 then 'left' when -1 then 'right' end horizontal , case v.dir when -1 then 'down' when 1 then 'up' end vertical from direction h inner join direction v on ( not (h.dir=0 and v.dir=0) ) ) , words as ( select lower(column_value) word from table( word_list( 'BPEL' ,'SOA' ,'WebService' ,'Java' ,'HTML' ,'JavaScript' ,'SQL' ,'CSS' ,'JavaServerFaces' ,'ADF' ,'JHeadstart' ,'Database' ,'Oracle' ,'Apache' ,'Lucene' ,'EJB' ,'TopLink' ,'Prince' ,'JDeveloper' ,'Eclipse' ,'Struts' ,'MVC' ,'tablespace' ,'ajax' ) ) ) select seq + ver * (length(word)-1) "Starting at row" , col + hor * (length(word)-1) " and Column " , horizontal "Going" , vertical " " , cast(word as varchar2(25)) "you will find the word" from ( select distinct cell , seq , col , hor , ver , sys_connect_by_path(cell,'*') p , word , horizontal , vertical from ( select c1.* , hor , ver , horizontal , vertical from cells c1 cross join directions ) cross join words start with cell = substr(words.word,1,1) connect by prior col-hor = col and prior seq-ver = seq and prior hor = hor and prior ver = ver and level < length(words.word)+1 and cell = substr(words.word, level,1) ) where translate(p,'Q*','Q') = word /