2012-09-24 13 views
6

Sono molto principiante allo sviluppo di query di Oracle Database. Sto sviluppando una funzionalità di ricerca per il mio progetto per cercare Negozi per Zip o Nome o Città, dove l'utente verrà fornito con "Una casella di input HTML" per inserire il termine di ricerca. C'è solo tabella denominata NegoziRicerca e visualizzazione dei risultati per rilevanza in Oracle

Le condizioni per la visualizzazione dei risultati della ricerca vengono

  1. Se il termine di ricerca abbinato al ZIP risultati dovrebbero essere GROUP e SORT BY ZIP DESC
  2. Se il termine di ricerca abbinato al NAME risultati dovrebbero essere gruppo e ordinare per NAME IN ASC e uguale a CITY
  3. Se il termine di ricerca corrisponde a ZIP, NAME e CITY (a tutti), poi la prima i risultati non corrispondenti al ZIP dovrebbe essere visualizzato in DESC order, prossimo CITY seguita dalla NAME

ho provato qualche cosa come questa

SELECT s.uuid AS uuid, COUNT(*) over() AS rowcount 
FROM Stores s 
WHERE s.postalcode LIKE '%87%' 
     OR s.city LIKE '%87%' 
     OR CONCAT(CONCAT(s.firstname, ' '),s.lastname) LIKE '%87%'    
GROUP BY s.city, s.postalcode, 
     CONCAT(CONCAT(s.firstname, ' '),s.lastname), s.uuid 
ORDER BY CASE WHEN s.postalcode LIKE '%87%' 
       THEN s.postalcode END DESC, 
     CASE WHEN CONCAT(CONCAT(s.firstname, ' '),s.lastname) LIKE '%87%' 
       THEN CONCAT(CONCAT(s.firstname, ' '),s.lastname) 
       ELSE s.postalcode END ASC, 
     CASE WHEN s.city LIKE '%87%' 
       THEN s.city END 

Questa query non è visualizzazione dei risultati come previsto (intendo che sta visualizzando i risultati senza ordine, non come Primo zip, città successiva seguita da nome).

Come posso fare la query per soddisfare i requisiti di cui sopra, devo usare le stored procedure per farlo? Qualsiasi suggerimento sarà molto apprezzato.

+1

questo suona come i compiti, contrassegnalo come tale se lo è. È anche sorprendente simile a questa domanda posta oggi: http://stackoverflow.com/questions/12564918/why-oracle-is-saying-not-a-group-by-expression – Harrison

+0

Hai provato a mettere il 'CASE'? costruire nella clausola 'ORDER BY' nelle clausole' SELECT' e 'GROUP BY'? Prova a metterlo esattamente così e possiamo vedere i risultati. – Rachcha

risposta

1

La mia risposta potrebbe non essere adatta allo schema ma so che può essere d'aiuto.

Ho una tabella address che contiene le colonne addressid, address1, address2, address3, city, zip, province, countryid, regionid, modified, modifiedby, VERSION, created, createdby.

Il mio requisito è quello di cercare per rilevanza, senza distinzione tra maiuscole e minuscole. Alla priorità più alta per la pertinenza è data alla colonna CITY. Quindi è ADDRESS3, ADDRESS2 e ADDRESS1.

Ho :searchKey come variabile di binding che deve essere immessa dall'utente (sto utilizzando SQL Developer su database Oracle). Sono stato con successo il seguente:

SELECT addressid, address1, address2, address3, city, zip 
     , province, regionid, countryid 
    FROM address 
    WHERE UPPER(address1||' '||address2||' '||address3||' '||city) 
     LIKE '%' || UPPER(:searchKey) || '%' -- << Makes search case insensitive 
ORDER BY CASE 
       WHEN UPPER(city) = UPPER(:searchKey)    THEN 10 
       WHEN UPPER(city) LIKE UPPER(:searchKey) || '%'  THEN 9 
       WHEN UPPER(city) LIKE '%'|| UPPER(:searchKey) ||'%' THEN 8 
       ELSE 0 
      END DESC -- << Highest priority given to cities that match the best 
     , CASE WHEN UPPER(address3) LIKE UPPER(:searchKey) ||'%'  THEN 5 
       WHEN UPPER(address3) LIKE '%'|| UPPER(:searchKey) ||'%' THEN 4 
       ELSE 0 
      END DESC 
     , CASE WHEN UPPER(address2) LIKE UPPER(:searchKey) ||'%'  THEN 3 
       WHEN UPPER(address2) LIKE '%'|| UPPER(:searchKey) ||'%' THEN 2 
       ELSE 0 
      END DESC 
     , CASE WHEN UPPER(address1) LIKE UPPER(:searchKey) ||'%'  THEN 2 
       WHEN UPPER(address1) LIKE '%'|| UPPER(:searchKey) ||'%' THEN 1 
       ELSE 0 
      END DESC 
; 

È possibile modificare i valori nel CASE costrutto per consentire la rilevanza secondo le vostre priorità.

Problemi correlati