VegetaSSJ5
09-09-2009, 11:00
Salve a tutti.
Devo implementare una query di ricerca in un'applicazione web i cui dati si trovano su un db SQL Server 2008.
La query in realtà già esiste e funziona bene, però deve essere modificata.
Partiamo da un esempio dal basso. La query è del tipo:
SELECT col1, col2, col3
FROM tab1 (join.....)
WHERE condizione
AND (col1 LIKE '%valore%' OR col2 LIKE '%valore%' OR col3 LIKE '%valore%')
Poichè bisogna gestire la paginazione la query diventa:
SELECT * FROM (
SELECT col1, col2, col3, ROWNUM() OVER (ORDER BY col1 ASC) AS ROWNUM
FROM tab1 (join...)
WHERE condizione
AND (col1 LIKE '%valore%' OR col2 LIKE '%valore%' OR col3 LIKE '%valore%')
) AS result WHERE result.ROWNUM BETWEEN 1 AND 15
In questo modo vengono restituiti solo i valori dalla posizione 1 alla 15.
Fin qui tutto bene, la query funziona perfettamente.
Ora però andrebbe modificata in questo modo: nel risultato devono comparire prima i record dove il LIKE è stato trovato nel campo col2, poi i record dove il LIKE è stato trovato negli altri campi. Mi è venuto in mente di fare una union in questo modo:
SELECT * FROM (
SELECT col1, col2, col3, ROWNUM() OVER (ORDER BY col1 ASC) AS ROWNUM
FROM tab1 (join...)
WHERE condizione
AND (col2 LIKE '%valore%')
UNION
SELECT col1, col2, col3, ROWNUM() OVER (ORDER BY col1 ASC) AS ROWNUM
FROM tab1 (join...)
WHERE condizione
AND (col1 LIKE '%valore%' OR col3 LIKE '%valore%')
) AS result WHERE result.ROWNUM BETWEEN 1 AND 15
Sarebbe una buona soluzione in quanto effettivamente vengono restituiti prima tutti i record in cui il like è stato trovato nel campo col2 e poi gli altri, però in questo modo i campi ROWNUM delle 2 query si duplicano creando problemi quindi con la paginazione.
Sapete suggerirmi qualcosa per risolvere il problema?
Grazie! :)
Devo implementare una query di ricerca in un'applicazione web i cui dati si trovano su un db SQL Server 2008.
La query in realtà già esiste e funziona bene, però deve essere modificata.
Partiamo da un esempio dal basso. La query è del tipo:
SELECT col1, col2, col3
FROM tab1 (join.....)
WHERE condizione
AND (col1 LIKE '%valore%' OR col2 LIKE '%valore%' OR col3 LIKE '%valore%')
Poichè bisogna gestire la paginazione la query diventa:
SELECT * FROM (
SELECT col1, col2, col3, ROWNUM() OVER (ORDER BY col1 ASC) AS ROWNUM
FROM tab1 (join...)
WHERE condizione
AND (col1 LIKE '%valore%' OR col2 LIKE '%valore%' OR col3 LIKE '%valore%')
) AS result WHERE result.ROWNUM BETWEEN 1 AND 15
In questo modo vengono restituiti solo i valori dalla posizione 1 alla 15.
Fin qui tutto bene, la query funziona perfettamente.
Ora però andrebbe modificata in questo modo: nel risultato devono comparire prima i record dove il LIKE è stato trovato nel campo col2, poi i record dove il LIKE è stato trovato negli altri campi. Mi è venuto in mente di fare una union in questo modo:
SELECT * FROM (
SELECT col1, col2, col3, ROWNUM() OVER (ORDER BY col1 ASC) AS ROWNUM
FROM tab1 (join...)
WHERE condizione
AND (col2 LIKE '%valore%')
UNION
SELECT col1, col2, col3, ROWNUM() OVER (ORDER BY col1 ASC) AS ROWNUM
FROM tab1 (join...)
WHERE condizione
AND (col1 LIKE '%valore%' OR col3 LIKE '%valore%')
) AS result WHERE result.ROWNUM BETWEEN 1 AND 15
Sarebbe una buona soluzione in quanto effettivamente vengono restituiti prima tutti i record in cui il like è stato trovato nel campo col2 e poi gli altri, però in questo modo i campi ROWNUM delle 2 query si duplicano creando problemi quindi con la paginazione.
Sapete suggerirmi qualcosa per risolvere il problema?
Grazie! :)