Newsgroup: it.comp.software.database
Titolo: SQLite e operatore LIKE

Salve a tutti. Ho un problema di cui non riesco a trovare la soluzione.
Ho la necessità di accedere ad un database memorizzato su DVD (quindi a 
sola lettura). Ho provato SQLite e ho constatato che i suoi database 
possono essere aperti anche da supporto ottico.
Il problema è che non riesco a far funzionare delle query del tipo
...WHERE nome_campo LIKE "%valore%";
La documentazione riporta che per fare questo tipo di pattern matching, 
occore usare la funzione interna like(campo, valore). Purtroppo anche in 
questo modo ottengo un resultset vuoto.
Ho provato con queste sintassi:
like(campo, "valore")
like(campo, "%valore%")
like(campo, 'valore')
like(campo, '%valore%')
ma niente. Nemmeno Google mi è stato d'aiuto. Voi avete qualche idea? 
Sarei disposto anche a cambiare database, purché giri da DVD senza 
bisogno di installare niente sul computer dell'utente che visiona il DVD.
Grazie in anticipo,
MT


Cosa intendi per "non riesco a far funzionare"?
Saluti  Manlio Perillo


Io uso SQLite da anni, e l'operatore LIKE funziona a dovere.
Che vuol dire 'non riesco a far funzionare'? Puoi mostrare un esempio?
ciao
gmax
-- 
  _  _ _  _
(_|| | |(_|><
  _|
http://gmax.oltrelinux.com

 Cosa intendi per "non riesco a far funzionare"?
Ciao. L'interprete SQLite non da errore, ma la query non restituisce 
alcun record.
MT

 Che vuol dire 'non riesco a far funzionare'? Puoi mostrare un esempio?
Certo. Ho una tabella di questo tipo:
create table Pagine (
   ID varchar(3),
   numero_pagina integer,
   parole_chiave text,
   temi text,
   oratore varchar(50)
);
Un tipico record di questa tabella è:
("001", 25, "milano, roma, napoli", "urbanistica", "Ing. Spalati")
Se provo ad eseguire una query di questo tipo:
select ID from Pagine where parole_chiave like "%roma%";
SQLite mi restituisce zero record. Mentre se come argomento del like 
scrivo "milano%" o "%napoli" (senza uno dei due caratteri jolly), ricevo 
il giusto numero di record.
Sulla documentazione c'è scritto che fare una query con like *infisso* 
(cioè con il carattere jolly % sia prima che dopo la sottostringa da 
ricercare, bisogna usare la funzione:
like(X, Y)
che sta per "X like Y". Ma anche in questo caso ricevo zero record.
Potete fare un esempio voi di come usate like?
MT


Guarda. Ecco il classico "a me funziona".
$ sqlite3 test
SQLite version 3.1.2
Enter ".help" for instructions
sqlite> create table Pagine (
    ...>   ID varchar(3),
    ...>   numero_pagina integer,
    ...>   parole_chiave text,
    ...>   temi text,
    ...>   oratore varchar(50)
    ...> );
sqlite> insert into Pagine values ("001", 25, "milano, roma, napoli", "urbanistica", "Ing. Spalati");
sqlite> insert into Pagine values ("002", 45, "firenze, cagliari, genova", "urbanistica", "Arch. Ferulli");
sqlite> insert into Pagine values ("003", 46, "roma, firenze, genova", "urbanistica", "Arch. Ferulli");
sqlite> insert into Pagine values ("004", 47, "roma, napoli, genova", "urbanistica", "Ing. Miccoli");
sqlite>  select ID from Pagine where parole_chiave like "%napoli%";
001
004
sqlite> select ID from Pagine where parole_chiave like "%roma%";
001
003
004
sqlite> select ID from Pagine where parole_chiave like "%cagliari%";
002
sqlite> select ID from Pagine where parole_chiave like "%genova%";
002
003
004
Stesso risultato eseguendo da Perl con SQLite 2 e 3
#!/usr/bin/perl
use strict;
use warnings;
use DBI;
# my $dbh=DBI->connect("dbi:SQLite:test3", "", "", {RaiseError => 1})
my $dbh=DBI->connect("dbi:SQLite2:test2", "", "", {RaiseError => 1})
          or die "Can't connect: $DBI::errstr\n";
$dbh->do(qq{
  create table Pagine (
   ID varchar(3),
   numero_pagina integer,
   parole_chiave text,
   temi text,
   oratore varchar(50)
)
});
$dbh->do(qq{
insert into Pagine values ("001", 25, "milano, roma, napoli", "urbanistica", "Ing. Spalati")});
$dbh->do(qq{
insert into Pagine values ("002", 45, "firenze, cagliari, genova", "urbanistica", "Arch. Ferulli")});
$dbh->do(qq{
insert into Pagine values ("003", 46, "roma, firenze, genova", "urbanistica", "Arch. Ferulli")});
$dbh->do(qq{
insert into Pagine values ("004", 47, "roma, napoli, genova", "urbanistica", "Ing. Miccoli")});
for my $citta (qw(roma firenze milano cagliari napoli))
{
     my $result = $dbh->selectcol_arrayref(
         qq{select ID from Pagine where parole_chiave like ?}, undef, "%$citta%");
     print "$citta : @$result\n";
}
roma     : 001 003 004
firenze  : 002 003
milano   : 001
cagliari : 002
napoli   : 001 004
Prova a scaricarti una versione piu' recente.
