【问题标题】:Searching and displaying results by relevance in Oracle在 Oracle 中按相关性搜索和显示结果
【发布时间】:2012-09-24 18:20:38
【问题描述】:

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

显示搜索结果的条件是

  1. 如果与ZIP匹配的搜索词结果应该是GROUP和SORT BY ZIP DESC
  2. 如果搜索词匹配到NAME结果应该是分组和排序NAME IN ASC和CITY一样
  3. 如果搜索词匹配ZIP,NAME和CITY(全部),那么首先匹配ZIP的结果应该显示在DESC order中,接下来是CITY,然后是The NAME

我尝试过类似的东西

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,下一个城市后跟名称)。

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

【问题讨论】:

  • 这听起来像是家庭作业,如果是,请标记它。与今天早些时候提出的这个问题也很相似:stackoverflow.com/questions/12564918/…
  • 您是否尝试过将ORDER BY 子句中的CASE 结构放入SELECT 和GROUP BY 子句中?试着把它完全像那样,我们可能会看到结果。

标签: sql oracle


【解决方案1】:

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

我有一个表 address,其中包含 addressid, address1, address2, address3, city, zip, province, countryid, regionid, modified, modifiedby, VERSION, created, createdby 列。

我的要求是按相关性搜索,不区分大小写。 列CITY 具有最高的相关性优先级。然后是ADDRESS3、ADDRESS2和ADDRESS1。

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

【讨论】:

    猜你喜欢
    • 2010-11-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-07
    相关资源
    最近更新 更多