Newsgroup: it.comp.lang.visual-basic
Titolo: istruzione SQL per cercare piu parole in un testo.

salve,
volevo chiedere una cosa complicata.
poniamo di avere un grosso DB contenente parecchio testo.
se io voglio selezionare solo le pagine/frasi/testi in cui ci siano le
parole "XX" e "YY" (non necessariamente una di seguito all'altra), oppure le
parore "XX" or "YY"... che tipo istruzione sql devo usare?
mi servirebbe qualcosa di simile a quello che in pratica fanno i motori di
ricerca... chiedo troppo..??
MarioH

 ha scritto nel messaggio
news:9hf7si$djk9p$1...@ID-70152.news.dfncis.de...

Direi qualcosa tipo
SELECT T.CAMPO1, T.CAMPO2, T.CAMPO3.....
FROM MiaTabella AS T
WHERE ((T.Campo1 like "*" & [Prarmetro1] & "*" ) or (T.Campo1 is Null)) AND
((T.Campo1 like "*" & [Prarmetro2] & "*" ) or (T.Campo1 is Null)) AND
((T.Campo1 like "*" & [Prarmetro3] & "*" ) or (T.Campo1 is Null)) AND
((T.Campo2 like "*" & [Prarmetro4] & "*" ) or (T.Campo2 is Null)) AND
((T.Campo2 like "*" & [Prarmetro5] & "*" ) or (T.Campo2 is Null)) AND
((T.Campo2 like "*" & [Prarmetro6] & "*" ) or (T.Campo2 is Null)) AND .....
Metti gli AND (come nell'esempio) se tutti i parametri devono essere
presenti contemporaneamente, oppure usi gli OR.
Inoltre se invece hai dei parametri di ricerca che devono comparire in un
certo ordine puoi usare qualcosa tipo
WHERE ((T.Campo1 like "*" & [Prarmetro1] & "*" & [Prarmetro2] & "*"  &
[Prarmetro3] & "*"  ) or (T.Campo1 is Null)) AND....
Spero di non aver sbagliato la sintassi, comunque l'idea è quella (funziona
perchè l'ho usata in Access per alcune maschere)
Max


il problema è cresce a dismisura se l'utente inserisce 10-20 parole
chiave...
MarioH

 chiave...
Se il numero di parametri non è conosciuto a priori allora devi generare la
query run-time.
Supponendo comunque che i campi su cui effetuare la ricerca siano sempre gli
stessi, ma che varino tipo e numero di parametri manterresti costante il
SELECT ed il FROM e dovresti generare run-time solo il WHERE; poi concateni
tutto in una stringa unica e la esegui.

 tutto in una stringa unica e la esegui.
Se l'ordine dei parametri non conta il blocco di base č sempre :
((T.Campo2 like "*" & [Prarmetro4] & "*" ) or (T.Campo2 is Null)) AND
oppure
((T.Campo2 like "*" & [Prarmetro4] & "*" ) or (T.Campo2 is Null)) OR
e tu lo codifichi con qualcosa di simile a quanto segue
"((T." & NomeCampo & " like "*" & Prarmetro & "*" ) or (T." & NomeCampo & "
is Null))"
potresti anche definirci una funzione tipo
public function BloccoWhere(nomeCampo as string, valoreParametro as string)
as string
  BloccoWhere="((T." & NomeCampo & " like ""*""" & Prarmetro & """*"" ) or
(T." & NomeCampo & " is Null))"
end function
e poi fai un loop che la richiama tante volte quanto serve, e cosě crei la
stinga del where
StrWhere="WHERE"
for each campo in insiemecampi
  for each parametro in campo.insiemeParametriDelCampo
    StrWhere=StrWhere & " " & BloccoWhere(campo.nome, parametro.valore) & "
AND "
  next parametro
next campo
StrWhere=left(strWhere, len(StrWhere)-5) 'serve altrimenti resta un " AND "
di troppo alla fine
Ciao, Max

 tutto in una stringa unica e la esegui.
per un'amica ho dovuto fare qualcosa del genere.
per semplificarmi la vita, ci sono due campi testo con due command.
sotto, una dbgrid.
in un txt puo' inserire una sola parola da cercare.
nell'altro puo' inserirne varie, separate da punto-e-virgola. il command
relativo esegue il codice qui sotto.
sembra vada. almeno, l'amica era contenta :)
nb: non ci sono gestione errori, controllo apici, ecc.
Private Sub cmdSearchWords_Click()
    If txtWords = "" Then Exit Sub
    txtWord = ""
    Dim sWords() As String
    Dim sSql As String
    sWords() = Split(txtWords, ";")
    sSql = "SELECT DISTINCT * FROM miniature WHERE ( immagine LIKE "
    Dim j As Integer
    For j = 0 To UBound(sWords)
        sSql = sSql & Chr(39) & "*" & Trim(sWords(j)) & "*" & Chr(39) _
            & " OR immagine LIKE "
    Next
    sSql = Left(sSql, Len(sSql) - 18)
'nb: 18 = len(" OR immagine LIKE ")
    sSql = sSql & " ) and fondo <> '-' ORDER BY immagine, fondo, numero"
'Debug.Print sSql
'Exit Sub
    Dim db As Database
    Dim rs As Recordset
    Set db = OpenDatabase("sogg_min")
    Set rs = db.OpenRecordset(sSql, dbOpenDynaset)
    dbResult.RecordsetType = 1 'dynaset
    'dbResult.RecordSource = sSql
    Set dbResult.Recordset = rs
    'dbResult.Refresh
    DBG.ReBind
End Sub


esatto... ottima soluzione. grazie
MarioH