我是Oracle数据库查询开发的初学者.我正在为我的项目开发搜索功能,以按Zip或名称或城市搜索商店,在那里将为用户提供"一个HTML输入框"以输入搜索词.只有表叫做商店
显示搜索结果的条件是
ZIP结果匹配,则应为GROUP和SORT BY ZIP DESCNAME结果匹配的搜索词应该是分组并按其排序NAME IN ASC和相同CITYZIP,NAME和CITY(对所有)匹配,那么首先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,下一个城市后跟名称).
如何进行查询以满足上述要求,是否需要使用存储过程来执行此操作?任何建议将不胜感激.
我的答案可能不适合您的架构,但我知道它可以提供帮助。
我有一个address包含 columns 的表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
;
Run Code Online (Sandbox Code Playgroud)
您可以更改构造中的值CASE,以根据您的优先级允许相关性。