我是 Oracle 数据库查询开发的初学者。我正在为我的项目开发搜索功能,以通过 搜索商店 zip 或 姓名 或 城市 ,其中将向用户提供“一个 HTML 输入框”来输入搜索词。只有一个名为 Stores 的表
显示搜索结果的条件是
ZIP
结果应该是 GROUP
和 SORT BY ZIP DESC
NAME
结果应按 NAME IN ASC
分组和排序与 CITY
相同ZIP
, NAME
和 CITY
(对所有人),然后首先匹配 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
, ADDRESS2
和 ADDRESS1
.
我有 :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/