我正在使用like查询旧的oracle数据库以匹配名称。如果一个多词模式(可以是1个词,3个词,8个词,随便什么)可以独立于词序与名字进行匹配就好了。例如,如果用户搜索 "rob jon"
,会匹配的
ROBERT JONES
JONATHON ADAM PROBE
但不匹配
ROB SMITH
PETER JONES
如果要求是“至少有一个单词应该匹配”,我可以使用 REGEXP_LIKE(name, 'rob|jon", 'i')
. 但我不知道如何使它匹配,只有当所有的字都在某个地方找到的名字。我可以用oracle文本来做这个,但是我不能在这个数据库中使用它。我也不能轻松地将单词存储在一个表中以连接到其中任何一个。
查询当前是静态的,并且使用绑定变量,因此我不希望为搜索模式中的每个单词添加额外的like predicate 。
有什么想法吗?
4条答案
按热度按时间dsekswqp1#
根据你的问题和帖子里的数据,我用了这个表格
插入语句:
如果你分别搜索“rob”和“jon”,那么试试这个方法。
如果你想搜索“rob jon”并得到你想要的结果,试试这个
amrnrhlw2#
您希望您的查询接受一个bind变量,该变量包含名称部分的空白分隔列表,例如“rob jon”。
您可以编写一个递归查询,从该字符串中获取单个名称部分。然后使用
NOT EXISTS
只保留不存在任何不匹配的名称。你可以替换
通过
如果你更喜欢的话。
演示:https://dbfiddle.uk/?rdbms=oracle_18&fiddle=5e48caaa20e9397afe65516504c62acd
fnvucqvd3#
如果不希望为搜索模式中的每个单词添加额外的like predicate (最好的解决方案imho),可以创建pl/sql函数来进行匹配
然后就可以有一个静态参数化查询。好的一面是,您可以在不接触前端应用程序的情况下扩展行为(例如添加高级搜索)。
ps:函数代码是特意留给你写的。问问你是否需要帮助。
ps2:返回“number”而不是布尔值将有助于使用遗留数据库驱动程序。如果你觉得合适的话,可以随意使用整数或布尔值。
deyfvvtc4#
建立在@jfrd解决方案上的无耻。。。这有什么好处吗(在大table上的表现将令人震惊)。
基本上,用“%”替换所有空格(此处不适用于连续空格)。