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

标签 sql oracle

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

显示搜索结果的条件是

  • 如果搜索词匹配 ZIP结果应该是 GROUPSORT BY ZIP DESC
  • 如果搜索词匹配 NAME结果应按 NAME IN ASC 分组和排序与 CITY 相同
  • 如果搜索词匹配 ZIP , NAMECITY (对所有人),然后首先匹配 ZIP 的结果应该显示在 DESC order , 下一个 CITY其次是 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,下一个城市后跟名称)。

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

    最佳答案

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

    我有一张 table address具有列 addressid, address1, address2, address3, city, zip, province, countryid, regionid, modified, modifiedby, VERSION, created, createdby .

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

    我有 :searchKey作为用户输入的绑定(bind)变量(我在 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 中的值构造以根据您的优先级允许相关性。

    关于sql - 在 Oracle 中按相关性搜索和显示结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12570616/

    相关文章:

    与 Row_Number 不同的 sql 查询

    Java/MySql - 获取一行并将其转换为 arraylist<String>

    sql - 将二进制 ID 字段转换为文本

    java - 更改现有数据的 Hibernate 序列生成

    sql - 基于用户角色权限的数据库设计

    sql - 如何并行化一个简单的 SELECT 查询?

    mysql - sql选择前10条记录

    javax.persistence.PersistenceException : org. hibernate.exception.SQLGrammarException:无法使用 heroku PostgreSQL 执行查询

    java - 如何在JAVA中接受REF游标而不导入Oracle包

    java - 是否可以在不同物理服务器上的 oracle 数据库和 postgresql 数据库之间使用数据库链接