Newsgroup: it.comp.www.asp
Titolo: Sql di ricerca su più campi

Ho una pagina ASP che ricerca in un db il nome del regista con il codice
riportato.
Il codice mi restituisce il nome del regista una sola volta se presente nel
db.
sql = "SELECT DISTINCT regista FROM LISTA_CON_DESCRIZ WHERE sistema = '"&
sist &"' and regista like '%"& nome &"%'"
rs.open sql,OBJdbConnection, 1, 3
If rs.Eof=True or rs.Bof=True then
Response.Write "<tr><td>Nessun risultato trovato con la lettera</TD></TR>"
Else
Do while Not rs.EOF
Response.Write "<TR><TD><a href='ricerca_titolo.asp?mode=scelto&select2=" &
tipo
Response.write "&select3=" & sist
Response.write "&textfield=" & rs("regista")
Response.write "'>"
Response.Write rs("regista")
Response.Write "</A> </TD></TR>"
rs.MoveNext
Loop
end if
Ora io vorrei fare la stessa cosa per gli attori che perņ ho due campi
distinti e se modifico la stringa sql in questo modo:
sql = "SELECT DISTINCT ATTORE1, ATTORE2 FROM LISTA_CON_DESCRIZ WHERE sistema
like '"& sist &"' and attore1 like '%"& nome &"%' or attore2 like '%"& nome
&"%'"
Non mi viene restituito il nome una sola volta perchč si puņ trovare nel
primo o nel secondo campo.
Potete darmi un suggerimento.
Marco

 Potete darmi un suggerimento.
Ciao Marco,
prova a modificare la query nel seguente modo:
USE tempdb
GO
/* Definisco la tabella dbo.LISTA_CON_DESCRIZ */
CREATE TABLE dbo.LISTA_CON_DESCRIZ(
AutoreID int NOT NULL IDENTITY PRIMARY KEY,
Attore1 varchar(10) NULL,
Attore2 varchar(10) NULL
)
GO
/* La popolo */
SET NOCOUNT ON
INSERT dbo.LISTA_CON_DESCRIZ VALUES('Lorenzo', NULL)
INSERT dbo.LISTA_CON_DESCRIZ VALUES(NULL, 'Lorenzo')
INSERT dbo.LISTA_CON_DESCRIZ VALUES('Lorenzo', NULL)
INSERT dbo.LISTA_CON_DESCRIZ VALUES('Andrea', NULL)
INSERT dbo.LISTA_CON_DESCRIZ VALUES('Luca', NULL)
SET NOCOUNT OFF
GO
/* Query */
SELECT MAX(Attore1) Attore1, MAX(Attore2) Attore2
FROM dbo.LISTA_CON_DESCRIZ
WHERE Attore1 LIKE '%Lor%'
OR Attore2 LIKE '%Lor%'
GO
/* Output:
Attore1    Attore2
---------- ---------- 
Lorenzo    Lorenzo
(1 row(s) affected)
Warning: Null value is eliminated by an aggregate or other SET operation.
*/
/* Query */
SELECT MAX(Attore1) Attore1, MAX(Attore2) Attore2
FROM dbo.LISTA_CON_DESCRIZ
WHERE Attore1 LIKE '%And%'
OR Attore2 LIKE '%And%'
GO
/* Output:
Attore1    Attore2
---------- ---------- 
Andrea     NULL
(1 row(s) affected)
Warning: Null value is eliminated by an aggregate or other SET operation.
*/
/* Naturalmente se tra i criteri di ricerca non compare una
** chiave univoca, rischi di otterene un risultato incongruente
*/
SELECT MAX(Attore1) Attore1, MAX(Attore2) Attore2
FROM dbo.LISTA_CON_DESCRIZ
WHERE Attore1 LIKE '%L%'
OR Attore2 LIKE '%L%'
GO
/* Output:
Attore1    Attore2
---------- ---------- 
Luca       Lorenzo
(1 row(s) affected)
Warning: Null value is eliminated by an aggregate or other SET operation.
*/
/* Pulizia */
DROP TABLE dbo.LISTA_CON_DESCRIZ
Ciao!
-- 
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://mvp.support.microsoft.com
http://italy.mvps.org

Ciao Marco,
ti propongo una seconda soluzione che fa uso della funzione COALESCE che
restituisce la prima espressione non null:
USE tempdb
GO
/* Definisco la tabella dbo.LISTA_CON_DESCRIZ */
CREATE TABLE dbo.LISTA_CON_DESCRIZ(
AutoreID int NOT NULL IDENTITY PRIMARY KEY,
Attore1 varchar(10) NULL,
Attore2 varchar(10) NULL
)
GO
/* La popolo */
SET NOCOUNT ON
INSERT dbo.LISTA_CON_DESCRIZ VALUES('Lorenzo', NULL)
INSERT dbo.LISTA_CON_DESCRIZ VALUES(NULL, 'Lorenzo')
INSERT dbo.LISTA_CON_DESCRIZ VALUES('Lorenzo', NULL)
INSERT dbo.LISTA_CON_DESCRIZ VALUES('Andrea', NULL)
INSERT dbo.LISTA_CON_DESCRIZ VALUES('Luca', NULL)
SET NOCOUNT OFF
GO
/* Query */
SELECT MAX(COALESCE(Attore1, Attore2)) Attore
FROM dbo.LISTA_CON_DESCRIZ
WHERE Attore1 LIKE '%Lor%'
OR Attore2 LIKE '%Lor%'
GO
/* Output:
Attore
---------- 
Lorenzo
(1 row(s) affected)
*/
/* Query */
SELECT MAX(COALESCE(Attore1, Attore2)) Attore
FROM dbo.LISTA_CON_DESCRIZ
WHERE Attore1 LIKE '%And%'
OR Attore2 LIKE '%And%'
GO
/* Output:
Attore
---------- 
Andrea
(1 row(s) affected)
*/
/* Occhio che l'incongruenza permane! */
SELECT MAX(COALESCE(Attore1, Attore2)) Attore
FROM dbo.LISTA_CON_DESCRIZ
WHERE Attore1 LIKE '%L%'
OR Attore2 LIKE '%L%'
GO
/* Output:
Attore
---------- 
Luca
(1 row(s) affected)
*/
/* Pulizia */
DROP TABLE dbo.LISTA_CON_DESCRIZ
Per maggiori informazioni sulla funzione COALESCE consulta il seguente
paragrafo sui Books Online:
"COALESCE" URL:tsqlref.chm::/ts_ca-co_9dph.htm
(Incolla l'URL nella dialog box che appare selezionando i menu Go, URL...).


 GO
Grazie per avermi risposto
Il mio db č access e credo che COALESCE non sia supportato oppure non
funziona.
Perň credo di non essermi spiegato.
Se nei due campi c'č
Attore1    Attore2
---------- ----------
Mario    Lorenzo
Lorenzo    Antonio
Lorenzino    Lorenzone
Lorenzo    Lory
ed il nome di ricerca che inserisco č LOR , l'sql mi deve restituire
Lorenzo
Lorenzino
Lorenzone
Lory
Sembra semplice ma non riesco a venirne fuori. Ho persato di passare i
risultati dei due campi a due array per poi confrontarli.
Credo perň di non conoscere cosě bene VBscript.
Non ho capito bene come consultare la funzione COALESCE. Dove sono i Book
online?
Ciao
Marco

 Book online?
I Books Online sono la documentazione in linea di SQL Server.


Grazie Larenzo per la tua pazienza e la spiegazione che mi hai dato.
Molte cose non le ho capite e il codice che mi hai postato sarà oggetto di
studio da parte mia. Comunque ho risolto con una stringa SQL di questo
genere:
SELECT Attore1 FROM (SELECT Attore1 FROM Film UNION SELECT Attore2 FROM
Film) as n WHERE Attore1 Like '%Lor%'
Nuovamente grazie
Marco