在Oracle中按相关性搜索和显示结果

时间:2012-09-24 18:20:39

标签: sql oracle

我是Oracle数据库查询开发的初学者。我正在为我的项目开发搜索功能,以 Zip 名称城市搜索商店,其中将向用户提供“One HTML输入框“输入搜索词。只有表叫做商店

显示搜索结果的条件是

  1. 如果搜索字词与ZIP匹配,则结果应为GROUPSORT BY ZIP DESC
  2. 如果搜索字词与NAME匹配,则结果应按NAME IN ASC分组并与CITY相同
  3. 如果搜索字词与ZIPNAMECITY(对所有)匹配,则首先与ZIP匹配的结果应显示在{{1接下来是DESC order
  4. 的下一个CITY

    我尝试过这样的事情

    NAME

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

    如何进行查询以满足上述要求,是否需要使用存储过程来执行此操作?任何建议将不胜感激。

1 个答案:

答案 0 :(得分:1)

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

我的表格address包含addressid, address1, address2, address3, city, zip, province, countryid, regionid, modified, modifiedby, VERSION, created, createdby列。

我的要求是按相关性搜索,不区分大小写。 相关性的最高优先级是CITY列。然后是ADDRESS3ADDRESS2ADDRESS1

我有: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构造中的值,以根据您的优先级确定相关性。