plsql多种情况,正则表达式匹配

时间:2018-06-26 13:04:37

标签: oracle plsql

我使用Oracle Apex 5编写了一个搜索工具,该工具具有2个特定的过滤器/搜索字段。我正在尝试搜索一个或两个,但是没有得到想要的结果。假设我的表中有“姓名姓氏”列,并使用“姓名姓氏”搜索字段。因此,数据将如下所示:

Name    | Surname
--------------------
Phil    | Anselmo
Max     | Cavalera
Maynard | Keenan
Kurt    | Cobain
David   | Gilmour

我在Apex中的搜索字段将是:

:P1_NAME
:P1_SURNAME

我要符合以下任一条件:

regexp_like(NAME, :P1_NAME, 'i') and regexp_like(SURNAME, :P1_SURNAME, 'i')

or

:P1_NAME is null and regexp_like(SURNAME, :P1_SURNAME, 'i')

or

:P1_SURNAME is null and regexp_like(NAME, :P1_NAME, 'i')

但是我不确定如何将其合并到单个选择中?这是我的最新选择。我尝试了很多其他的东西。

select name, surname, from leads 
where :P1_SURNAME is null and regexp_like(NAME, :P1_NAME, 'i')
or :P1_NAME is null and regexp_like(SURNAME, :P1_SURNAME, 'i')
or regexp_like(NAME, :P1_NAME, 'i') and regexp_like(SURNAME, :P1_SURNAME, 'i')

3 个答案:

答案 0 :(得分:2)

如果为分组条件添加括号,您的选择似乎很好:

select name, surname, from leads 
    where (:P1_SURNAME is null and regexp_like(NAME, :P1_NAME, 'i'))
    or (:P1_NAME is null and regexp_like(SURNAME, :P1_SURNAME, 'i'))
    or (regexp_like(NAME, :P1_NAME, 'i') and regexp_like(SURNAME, :P1_SURNAME, 'i'))

答案 1 :(得分:2)

您只需要在每个条件内加上括号,即:

select name, surname
from   leads 
where  (:P1_SURNAME is null and regexp_like(NAME, :P1_NAME, 'i'))
or     (:P1_NAME is null and regexp_like(SURNAME, :P1_SURNAME, 'i'))
or     (regexp_like(NAME, :P1_NAME, 'i') and regexp_like(SURNAME, :P1_SURNAME, 'i'))

这意味着这些条件中至少有一组必须为真,并且在每个条件内,两个子条件都必须为真才能使该条件成立。

答案 2 :(得分:0)

尝试此查询:

select name, surname from leads
where 
instr( upper(:P1_SURNAME), upper(SURNAME) ) + instr( upper(:P1_NAME), upper(NAME) ) > 0