7

我是 Oracle 数据库查询开发的初学者。我正在为我的项目开发搜索功能,以按ZipNameCity搜索 Stores ,其中将向用户提供“一个 HTML 输入框”来输入搜索词。只有一个名为 Stores 的表

显示搜索结果的条件是

  1. 如果与结果匹配的搜索词ZIP应该是GROUPSORT BY ZIP DESC
  2. 如果与结果匹配的搜索词NAME应该是 group 和 sort byNAME IN ASC并且与 to 相同CITY
  3. 如果搜索词与ZIP,NAMECITY(to all) 匹配,则首先匹配的结果ZIP应显示在 中DESC orderCITY然后是 TheNAME

我试过这样的事情

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 

此查询未按预期显示结果(我的意思是它显示没有顺序的结果,而不是像第一个 zip,下一个城市后跟名称)。

如何进行查询以满足上述要求,我是否需要使用存储过程来做到这一点?任何建议将不胜感激。

4

1 回答 1

2

我的回答可能不适合您的架构,但我知道它可以提供帮助。

我有一个address有列的表addressid, address1, address2, address3, city, zip, province, countryid, regionid, modified, modifiedby, VERSION, created, createdby

我的要求是按相关性搜索,不区分大小写。列的相关性最高CITY。然后是ADDRESS3和。ADDRESS2ADDRESS1

我有:searchKey一个要由用户输入的绑定变量(我在 Oracle 数据库上使用 SQL Developer)。我已成功使用以下内容:

  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
;

您可以CASE根据您的优先级更改构造中的值以允许相关性。

于 2012-11-27T07:38:44.397 回答