2012-09-24 17 views
6

Soy un principiante en el desarrollo de consultas de Oracle Database. Estoy desarrollando una funcionalidad de búsqueda para mi proyecto para buscar tiendas por Zip o Nombre o Ciudad, donde se le proporcionará al usuario "Un cuadro de entrada HTML" para ingresar el término de búsqueda. No sólo almacena tabla llamadaBúsqueda y visualización de resultados por relevancia en Oracle

Las condiciones para mostrar los resultados de la búsqueda se

  1. Si el término de búsqueda adaptado a ZIP resultados deben ser GROUP y SORT BY ZIP DESC
  2. Si el término de búsqueda adaptado a NAME resultados debe ser grupo y ordenar por NAME IN ASC y lo mismo que CITY
  3. Si el término de búsqueda coincide con ZIP, NAME y CITY (a todos), a continuación, en primer lugar los resultados emparejados a la ZIP debe mostrarse en DESC order, junto CITY seguido por el NAME

He intentado algo como esto

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 

Esta consulta no es mostrando los resultados como se esperaba (me refiero a que está mostrando resultados sin orden, no como First zip, next city seguido por name).

¿Cómo puedo hacer la consulta para cumplir con los requisitos anteriores? ¿Necesito usar procedimientos almacenados para hacer eso? Cualquier sugerencia será muy apreciada.

+1

esto suena como tarea, márcalo como tal si lo es. También es sorprendente similar a la pregunta formulada hoy: http://stackoverflow.com/questions/12564918/why-oracle-is-saying-not-a-group-by-expression – Harrison

+0

¿Has intentado poner el 'CASE' construir en la cláusula 'ORDER BY' en las cláusulas' SELECT' y 'GROUP BY'? Intenta ponerlo exactamente así y que podamos ver los resultados. – Rachcha

Respuesta

1

Mi respuesta puede no ser para su esquema pero sé que puede ayudar.

Tengo una tabla address que tiene columnas addressid, address1, address2, address3, city, zip, province, countryid, regionid, modified, modifiedby, VERSION, created, createdby.

Mi requisito es buscar por relevancia, sin distinción de mayúsculas y minúsculas. En la prioridad más alta para la relevancia se da a la columna CITY. Entonces es ADDRESS3, ADDRESS2 y ADDRESS1.

Tengo :searchKey como una variable de vinculación que debe ser ingresada por el usuario (estoy usando SQL Developer en la base de datos Oracle). He estado usando con éxito el siguiente:

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 
; 

Puede cambiar los valores en el CASE constructo para permitir la relevancia según sus prioridades.

Cuestiones relacionadas