2012-09-24 12 views
6

Ich bin sehr Anfänger in Oracle Datenbankabfrage Entwicklung. Ich entwickle eine Suchfunktionalität für mein Projekt zur Suche nach Stores nach PLZ oder Name oder Stadt, wo der Benutzer mit "Ein HTML-Eingabefeld" zur Eingabe des Suchbegriffs versehen wird. Es gibt nur Tabelle namens StoresSuchen und Anzeigen von Ergebnissen nach Relevanz in Oracle

Die Bedingungen für die Anzeige von Suchergebnissen sind

  1. Wenn der Suchbegriff zu ZIP Ergebnisse angepasst sollte GROUP und SORT BY ZIP DESC
  2. werden, wenn der Suchbegriff NAME Ergebnisse angepasst Gruppe sein sollte und sortieren nach NAME IN ASC und gleich CITY
  3. Wenn der Suchbegriff auf ZIP, NAME undabgestimmt ist 210 (alle), dann werden zuerst die auf die ZIP abgeglichen Resultate sollten nächste CITY von The Diese Abfrage soetwas wie dieses

    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 
    

    versucht, ich habe NAME

gefolgt in DESC order angezeigt werden soll, nicht Anzeigen der Ergebnisse wie erwartet (ich meine, es zeigt Ergebnisse ohne Reihenfolge, nicht wie First PLZ, nächste Stadt gefolgt von Name).

Wie kann ich die Abfrage ausführen, um die oben genannten Anforderungen zu erfüllen, muss ich gespeicherte Prozeduren verwenden, um das zu tun? Irgendwelche Vorschläge werden sehr geschätzt.

+1

das klingt wie Hausaufgaben, markieren Sie es als solches, wenn es ist. Es ist auch erschreckend ähnlich dieser Frage heute früh gestellt: http://stackoverflow.com/questions/12564918/why-oracle-is-saying-not-a-group-by-expression – Harrison

+0

Haben Sie versucht, die 'CASE' zu setzen Konstrukt in der 'ORDER BY'-Klausel in die' SELECT'- und 'GROUP BY'-Klauseln? Versuchen Sie es genau so und sehen wir die Ergebnisse. – Rachcha

Antwort

1

Meine Antwort möglicherweise nicht für Ihr Schema, aber ich weiß, dass es helfen kann.

Ich habe eine Tabelle address, die Spalten hat addressid, address1, address2, address3, city, zip, province, countryid, regionid, modified, modifiedby, VERSION, created, createdby.

Meine Anforderung ist die Suche nach Relevanz, Groß- und Kleinschreibung nicht zu beachten. Bei der höchsten Priorität für Relevanz ist die Spalte CITY gegeben. Dann ist es ADDRESS3, ADDRESS2 und ADDRESS1.

Ich habe :searchKey als Bind-Variable, die vom Benutzer eingegeben werden soll (ich verwende SQL Developer auf Oracle-Datenbank). Ich habe folgendes erfolgreich im Einsatz: im CASE Konstrukt

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 
; 

Sie können die Werte ändern, um die Relevanz wie pro Ihre Prioritäten zu ermöglichen.

Verwandte Themen