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

chi*_*ddy 6 sql oracle

我是Oracle数据库查询开发的初学者.我正在为我的项目开发搜索功能,以按Zip名称城市搜索商店,在那里将为用户提供"一个HTML输入框"以输入搜索词.只有表叫做商店

显示搜索结果的条件是

  1. 如果搜索词与ZIP结果匹配,则应为GROUPSORT BY ZIP DESC
  2. 如果与NAME结果匹配的搜索词应该是分组并按其排序NAME IN ASC和相同CITY
  3. 如果搜索词与ZIP,NAMECITY(对所有)匹配,那么首先ZIP应该显示与之匹配的结果DESC order,接下来CITY是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 
Run Code Online (Sandbox Code Playgroud)

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

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

Rac*_*cha 2

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

我有一个address包含 columns 的表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
;
Run Code Online (Sandbox Code Playgroud)

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