想根据搜索字符串从表中搜索记录
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
这也是正确的。
那么你得到了什么结果?
【讨论】:
以上是关于想根据搜索字符串从表中搜索记录的主要内容,如果未能解决你的问题,请参考以下文章