想根据搜索字符串从表中搜索记录

Posted

技术标签:

【中文标题】想根据搜索字符串从表中搜索记录【英文标题】:want to search a record from table based on search string 【发布时间】:2011-09-08 11:35:08 【问题描述】:

我们。 此搜索是存储过程的一部分。

以下是我们需要的: 1. 在表 ppl 中有列名称,其中包含名称,姓氏格式的数据 说记录是 巴拉克,欧巴 酒吧,奥巴马 还有巴拉克,奥巴马。

    我们想根据搜索字符串选择记录。搜索字符串可以是姓名或姓氏。

    我们希望根据搜索字符串进行精确搜索。 表示搜索字符串是否为 bar;它不应该返回 barack,obama 记录并且应该只返回 bar,obama。 类似的精确搜索姓氏部分。

    我们不知道搜索字符串是否包含姓名或姓氏。 所以搜索字符串甚至可以是“oba”..它应该只返回“barack,oba”记录。

遵循我们迄今为止尝试过的方法;但这些都不起作用:

    从 ppl 中选择名称,其中名称如 'bar,%' 或名称如 '%,bar'; 这适用于姓名部分,但不适用于姓氏部分。

select name from ppl where name like 'oba,%' or name like '%,oba'; 没有给出正确的结果。

    从 ppl 中选择名称,其中名称 = ANY('%,oba',oba,%'); - 不工作

    select name from ppl where regexp_like (name,'^,oba$') OR regexp_like (name,'oba$,^'); - 不工作

我请求您分享您在这种情况下的想法。

【问题讨论】:

我不明白你为什么说name like 'bar,%' or name like '%,bar' 不起作用。它对我有用。当然,你没有姓“酒吧”的人…… 它不适用于姓氏部分意味着像'%,oba'这样的名字或像'oba,%'这样的名字不起作用:( 查询中还有条件吗?如果不使用括号,您将无法成功混合 AND 和 OR。 【参考方案1】:

您需要使用正则表达式 (REGEX)。

有很多网站描述了如何使用它们,例如:

http://download.oracle.com/docs/cd/B19306_01/appdev.102/b14251/adfns_regexp.htm

http://www.dba-oracle.com/t_regular_expressions.htm

http://orafaq.com/node/2404

对于您所描述的示例(这就是我所要做的),您可以使用:

SELECT name_column
  FROM ppl
 WHERE REGEXP_INSTR(name_column, '^.*'||v_name||'(, *|$).*', 1, 1, 0, 'c') > 0;

以编程方式将 v_name 替换为您的姓名字符串。如果要不区分大小写地搜索名称字符串,则:

SELECT name_column
  FROM ppl
 WHERE REGEXP_INSTR(name_column, '^.*'||v_name||'(, *|$).*', 1, 1, 0, 'i') > 0;

编辑:您可能使用 REGEXP_LIKE 比 REGEXP_INSTR 更好,但我有一些类似于手的东西。

例如不区分大小写:

SELECT name_column
  FROM ppl
 WHERE REGEXP_LIKE(name_column, '^.*'||v_name||'(, *|$).*', 'i');

区分大小写:

SELECT name_column
  FROM ppl
 WHERE REGEXP_LIKE(name_column, '^.*'||v_name||'(, *|$).*', 'c');

希望这会有所帮助...

【讨论】:

【参考方案2】:

根据示例数据和 SQL 您的问题,我看不出您有问题:

首先我复制了您的表和数据(使用 SQL Plus):

SQL> create table ppl (name varchar2(30));

Table created.

SQL> insert into ppl values ('barack,oba');

1 row created.

SQL> insert into ppl values ('bar,obama');

1 row created.

SQL> insert into ppl values ('barack,obama');

1 row created.

SQL> commit;

Commit complete.

SQL> select * from ppl;

NAME                                                                            
------------------------------                                                  
barack,oba                                                                      
bar,obama                                                                       
barack,obama                                                                    

现在您的查询:

SQL> select * from ppl where name like 'bar,%' or name like '%,bar';

NAME                                                                            
------------------------------                                                  
bar,obama                                                                       

没错。

SQL> select * from ppl where name like 'oba,%' or name like '%,oba';

NAME                                                                            
------------------------------                                                  
barack,oba                                                                      

这也是正确的。

那么你得到了什么结果?

【讨论】:

以上是关于想根据搜索字符串从表中搜索记录的主要内容,如果未能解决你的问题,请参考以下文章

如何实现搜索功能?

从表中检索最后 N 条记录

MySql 查询从表中找出前 50% 的记录

Yii2 - 活动记录查询搜索字符串字段中的数字

如何从表中删除重复记录? [复制]

在 mySQL 中的整个表中搜索字符串