2010-03-12 14 views
13

Hanno molti risultati non necessari utilizzando il metodo contains() nella mia query. Non dirmi di usare come o qualcos'altro. È hardcoded e non può essere cambiato.Come funziona contains() in PL-SQL?

+2

Potresti inviare la query? – Padmarag

+0

posso passare qualsiasi parametro in contiene per restringere i risultati della ricerca al risultato esatto – Artic

+0

Selezionare * da blabla dove contiene (dFullText, "auto") – Artic

risposta

15

Contiene viene utilizzato su campi di testo che hanno un 'CONTESTO Index', che indicizza un campo di testo per la ricerca. L'utilizzo standard è così (usando l'operatore score per visualizzare ciò che viene restituito dalla clausola contains base al 1 contains corrispondenza del 1 score):

SELECT score(1), value 
FROM table_name 
WHERE CONTAINS(textField, 'searchString', 1) > 0; 

Per i dati come questa nel tavolo table_name

value | textField 
-------|----------------------------------------------- 
A  | 'Here is searchString. searchString again.' 
B  | 'Another string' 
C  | 'Just one searchString' 

Quella interrogazione restituisce

2 A 
1 C 

Così contiene è simile a come, ma conterrà quante volte una stringa si verifica in un campo di testo. Non riuscivo a trovare una risorsa utilizzando contiene il modo in cui viene utilizzato nella query che hai postato, ma penso che sarebbe restituire le righe in cui dFullText ha almeno un'istanza di car in essa, o l'equivalente di questo sql:

Select * from blabla where dFullText like "%car%" 

Here è un'altra fonte.

+0

C'è qualche differenza tra contiene() e instr()? – Rene

+0

@Rene, sì sono diversi. 'Contains() 'conta quante volte una stringa si verifica in un campo di testo e restituisce quel numero. 'instr()' cerca una stringa in un campo (o un'altra stringa) e restituisce l'indice della prima stringa di ricerca trovata (o 0 se non è stata trovata). Vedi esempi di 'instr()' su http://www.techonthenet.com/oracle/functions/instr.php – rosscj2533

0

Vedi questo esempio da oracle.com

declare 
rowno number := 0; 
    begin 
    for c1 in (SELECT SCORE(1) score, title FROM news 
      WHERE CONTAINS(text, 'oracle', 1) > 0 
      ORDER BY SCORE(1) DESC) 
    loop 
    rowno := rowno + 1; 
    dbms_output.put_line(c1.title||': '||c1.score); 
exit when rowno = 10; 
end loop; 
end;