|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Senior Member
Iscritto dal: Sep 2002
Città: Celano (AQ) Segno_Zodiacale: Leone Ascendente: Cammello Segni_Particolari: Quello
Messaggi: 9571
|
[SQL] Chiedo aiuto per una query su SQL Server 2008
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: Codice:
SELECT col1, col2, col3 FROM tab1 (join.....) WHERE condizione AND (col1 LIKE '%valore%' OR col2 LIKE '%valore%' OR col3 LIKE '%valore%') Codice:
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 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: Codice:
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 Sapete suggerirmi qualcosa per risolvere il problema? Grazie! Ultima modifica di VegetaSSJ5 : 09-09-2009 alle 11:02. |
|
|
|
|
|
#2 |
|
Senior Member
Iscritto dal: Jul 2007
Messaggi: 1092
|
Non ho sql server a portata di mano e lo conosco poco. In mysql farei così, ma suppongo sia la stessa cosa anche col tuo rdbms.
Codice:
select *,if(col2 like "%pippo%",1,0) as ordine from tabella where col1 like "%pippo%" or col2 like "%pippo%" or col3 like "%pippo%" order by ordine desc |
|
|
|
|
|
#3 | |
|
Senior Member
Iscritto dal: Sep 2002
Città: Celano (AQ) Segno_Zodiacale: Leone Ascendente: Cammello Segni_Particolari: Quello
Messaggi: 9571
|
Quote:
ho capito l'idea ma non saprei come riprodurre in sql server questo: if(col2 like "%pippo%",1,0) |
|
|
|
|
|
|
#4 |
|
Senior Member
Iscritto dal: Jul 2007
Messaggi: 1092
|
Adesso mi è stato possibile testare la cosa.
Codice:
select *, case when col2 like '%pippo%' then 1 else 0 end as ordine from tabella where col1 like '%pippo%' or col2 like '%pippo%' or col3 like '%pippo%' order by ordine desc edit. Ho fatto una rapida gugolata e mi pare di capire che non esista proprio il costrutto if ma che sia sempre necessario ricorrere al case. Ultima modifica di john_revelator : 09-09-2009 alle 23:14. |
|
|
|
|
|
#5 |
|
Member
Iscritto dal: Feb 2009
Messaggi: 112
|
in teoria, potresti usare un'istruzione del genere:
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, 10000 + 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 or result.ROWNUM BETWEEN 10001 AND 10015 in questo modo dovresti ottenere le prime 15 righe della prima e le prime 15 della seconda |
|
|
|
|
|
#6 | |
|
Senior Member
Iscritto dal: Sep 2002
Città: Celano (AQ) Segno_Zodiacale: Leone Ascendente: Cammello Segni_Particolari: Quello
Messaggi: 9571
|
Quote:
ma non funziona, cioè la query viene eseguita correttamente ma non viene aggiunto il valore 10000... |
|
|
|
|
|
|
#7 |
|
Member
Iscritto dal: Feb 2009
Messaggi: 112
|
strano
purtoppo non ho modo di testare, però ho trovato quest'altro comando che potrebbe fare al caso tuo SELECT TOP 15 ROW_NUMBER() OVER (ORDER BY Date DESC) AS Row |
|
|
|
|
|
#8 |
|
Senior Member
Iscritto dal: Sep 2002
Città: Celano (AQ) Segno_Zodiacale: Leone Ascendente: Cammello Segni_Particolari: Quello
Messaggi: 9571
|
il fatto è che quel rownumber mi serve per gestire la paginazione, ed è quindi dinamico... quindi in questo esempio prende i valori tra 1 e 15, ma in una ipotetica pagina 5 prende i valori tra 76 e 90.
|
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 11:41.




















