Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Nuova Dacia Spring, del modello precedente resta solo il nome: più grande, più efficiente e ora prodotta in Europa
Nuova Dacia Spring, del modello precedente resta solo il nome: più grande, più efficiente e ora prodotta in Europa
La seconda generazione della citycar elettrica di Dacia passa alla piattaforma RGEV small di Renault Group, cresce di 15 cm in lunghezza e 18 cm in larghezza, adotta un motore da 80 CV e una batteria LFP da 27,5 kWh per 250 km WLTP. Prezzi da 17.900 euro, produzione a Novo Mesto in Slovenia.
BOOX Picco: l'ebook reader minuscolo è una genialata, e si può attaccare allo smartphone
BOOX Picco: l'ebook reader minuscolo è una genialata, e si può attaccare allo smartphone
BOOX ha portato sul mercato Picco, un e-reader da 3,97 pollici che pesa 58 grammi e si aggancia al retro dello smartphone con un anello magnetico. Lo abbiamo usato con Pixel 11 Pro XL e iPhone 18 Pro per capire se un formato così ridotto regga la prova della lettura quotidiana
AMD EPYC Venice: dentro Zen 6, i SoC a 256 core e la sfida al costo della memoria
AMD EPYC Venice: dentro Zen 6, i SoC a 256 core e la sfida al costo della memoria
A Las Vegas AMD ha svelato i dettagli architetturali delle CPU EPYC di sesta generazione, note con il nome in codice Venice. Nuovi core Zen 6 e Zen 6c costruiti a 2 nanometri, fino a 256 core per socket, 16 canali di memoria, interfaccia PCI Express 6.0 e un'intera famiglia di proposte che va da Venice SP7 a Verano. Senza dimenticare la memoria, oggi la voce di costo più pesante in un server: AMD risponde con CXL 3.1 e con la tecnologia software MEXT, che porta la memoria flash dentro la gerarchia della DRAM.
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 09-09-2009, 11:00   #1
VegetaSSJ5
Senior Member
 
L'Avatar di VegetaSSJ5
 
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%')
Poichè bisogna gestire la paginazione la query diventa:
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
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:
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
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!

Ultima modifica di VegetaSSJ5 : 09-09-2009 alle 11:02.
VegetaSSJ5 è offline   Rispondi citando il messaggio o parte di esso
Old 09-09-2009, 20:15   #2
john_revelator
Senior Member
 
L'Avatar di john_revelator
 
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
john_revelator è offline   Rispondi citando il messaggio o parte di esso
Old 09-09-2009, 20:59   #3
VegetaSSJ5
Senior Member
 
L'Avatar di VegetaSSJ5
 
Iscritto dal: Sep 2002
Città: Celano (AQ) Segno_Zodiacale: Leone Ascendente: Cammello Segni_Particolari: Quello
Messaggi: 9571
Quote:
Originariamente inviato da john_revelator Guarda i messaggi
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
grazie!
ho capito l'idea ma non saprei come riprodurre in sql server questo: if(col2 like "%pippo%",1,0)
VegetaSSJ5 è offline   Rispondi citando il messaggio o parte di esso
Old 09-09-2009, 23:07   #4
john_revelator
Senior Member
 
L'Avatar di john_revelator
 
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
In effetti usando l'if non funzionava. So che in questo forum gli esperti di sql server non mancano. Sicuramente qualcuno ci dirà se è possibile risolvere anche con l'if.

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.
john_revelator è offline   Rispondi citando il messaggio o parte di esso
Old 10-09-2009, 08:54   #5
EnricoHU
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
EnricoHU è offline   Rispondi citando il messaggio o parte di esso
Old 10-09-2009, 10:26   #6
VegetaSSJ5
Senior Member
 
L'Avatar di VegetaSSJ5
 
Iscritto dal: Sep 2002
Città: Celano (AQ) Segno_Zodiacale: Leone Ascendente: Cammello Segni_Particolari: Quello
Messaggi: 9571
Quote:
Originariamente inviato da EnricoHU Guarda i messaggi
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
ci ho provato ma mettendo il 10000 dopo, cioè ... ROWNUM() OVER (...) + 10000 AS ROWNUM...

ma non funziona, cioè la query viene eseguita correttamente ma non viene aggiunto il valore 10000...
VegetaSSJ5 è offline   Rispondi citando il messaggio o parte di esso
Old 10-09-2009, 14:06   #7
EnricoHU
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
EnricoHU è offline   Rispondi citando il messaggio o parte di esso
Old 10-09-2009, 16:04   #8
VegetaSSJ5
Senior Member
 
L'Avatar di VegetaSSJ5
 
Iscritto dal: Sep 2002
Città: Celano (AQ) Segno_Zodiacale: Leone Ascendente: Cammello Segni_Particolari: Quello
Messaggi: 9571
Quote:
Originariamente inviato da EnricoHU Guarda i messaggi
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
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.
VegetaSSJ5 è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Nuova Dacia Spring, del modello precedente resta solo il nome: più grande, più efficiente e ora prodotta in Europa Nuova Dacia Spring, del modello precedente resta...
BOOX Picco: l'ebook reader minuscolo è una genialata, e si può attaccare allo smartphone BOOX Picco: l'ebook reader minuscolo è un...
AMD EPYC Venice: dentro Zen 6, i SoC a 256 core e la sfida al costo della memoria AMD EPYC Venice: dentro Zen 6, i SoC a 256 core ...
HONOR Pad X9 Max recensione, schermo ultra large a meno di 400 euro HONOR Pad X9 Max recensione, schermo ultra large...
Lenovo ThinkPad X1 Carbon Gen 14: il business ultraleggero si rinnova dall’interno Lenovo ThinkPad X1 Carbon Gen 14: il business ul...
TIM continuerà ad aumentare i pre...
In arrivo smartphone pieghevoli enormi: ...
Tesla Semi sbarca a Chicago: 50 camion e...
L'accordo tra Google e il Napoli continu...
Remus Stealer: così il malware rivendica...
Internet a casa senza fibra né linea tel...
Roborock Saros 20 Flow Complete a 799€ s...
Insta360 X5 a 439€ su Amazon: la videoca...
GWM sfida la Ferrari SF90: la prima supe...
Jensen Huang deve tornare: oltre 1.600 d...
Le cuffie Xiaomi Redmi Neo a soli 39,99€...
Il DLSS ha un rivale? Apex Neural Render...
TV Samsung da 75 pollici a soli 499€ (in...
Cybertruck non muore (quasi): Tesla post...
Wolfenstein 3 è ufficiale: Machin...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 11:36.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Served by www3v