我们希望根据搜索字符串从表中搜索记录。 此搜索是存储过程的一部分。
以下是我们所需要的: 1.在表ppl中,列名包含name,surname格式的数据 说记录是 巴拉克,奥巴 酒吧,奥巴马 和巴拉克,奥巴马。
我们希望根据搜索字符串进行精确搜索。 表示搜索字符串是否为bar;它不应该返回barack,obama记录,只应该只返回bar,obama。 类似的确切搜索姓氏部分。
我们不知道搜索字符串是否有姓名或姓氏。 所以搜索字符串甚至可以是“oba”..它应该只返回“barack,oba”记录。
我们已经尝试了以下方法,直到现在;但这些都没有奏效:
从ppl中选择名称,其中名称为'oba,%'或名称如'%,oba'; 没有给出正确的结果。
从ppl中选择名称,其中name = ANY('%,oba',oba,%'); - 不工作
从ppl中选择名称,其中regexp_like(name,'^,oba $')或regexp_like(name,'oba $,^'); - 不工作
我请求您在这种情况下分享您的想法。
答案 0 :(得分: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
对于您所描述的示例(因为我必须继续),您可以使用:
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_INSTR更好地使用REGEXP_LIKE,但我有一些类似于手的。
e.g。不区分大小写:
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');
希望这会有所帮助......
答案 1 :(得分:0)
根据示例数据和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
这也是正确的。
那么你得到的结果是什么?