我是Oracle数据库查询开发的初学者。我正在为我的项目开发搜索功能,以 Zip 或名称或城市搜索商店,其中将向用户提供“One HTML输入框“输入搜索词。只有表叫做商店
显示搜索结果的条件是
ZIP
匹配,则结果应为GROUP
和SORT BY ZIP DESC
NAME
匹配,则结果应按NAME IN ASC
分组并与CITY
相同ZIP
,NAME
和CITY
(对所有)匹配,则首先与ZIP
匹配的结果应显示在{{1接下来是DESC order
CITY
醇>
我尝试过这样的事情
NAME
此查询未按预期显示结果(我的意思是它显示没有订单的结果,而不是像第一个zip,下一个城市后跟名称)。
如何进行查询以满足上述要求,是否需要使用存储过程来执行此操作?任何建议将不胜感激。
答案 0 :(得分: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
构造中的值,以根据您的优先级确定相关性。