如何在regexp_like产品上使用nvl

时间:2016-03-03 16:19:09

标签: oracle oracle11g

有人可以帮助解决SQL问题吗? 我有一个查询,它当前接受一个外部参数,该参数可以为null或单个值,例如'STR1'。

这由以下格式的查询处理:

select a.refe_id  from a,  b,  c
where a.owln_code = c.code
and c.con_id =  b.pers_id
and b.con_abbrv = nvl(:PARAM, b.con_abbrv)
and a.status = '01'

将来外部参数可以有一个值,null或由管道分隔的多个值,例如STR1 | STR2 | STR3 |

我现在处于下面的阶段以适应这个但是已经失去了nvl测试,如果参数为null,则允许匹配表b中的所有行。 有人可以帮忙解决这个问题吗?我在网上搜索并试图自己做。非常感谢提前。

select a.refe_id  from a,  b,  c
where a.owln_code = c.code
and c.con_id =  b.pers_id
and regexp_like(:PARAM, '(^|)' || b.con_abbrv|| '(|$)')
and a.status = '01'

1 个答案:

答案 0 :(得分:0)

我建议这样的事情:

select a.refe_id  from a,  b,  c
where a.owln_code = c.code
  and c.con_id =  b.pers_id
  and (:PARAM IS NULL OR regexp_like(:PARAM, '(^|)' || b.con_abbrv|| '(|$)'))
  and a.status = '01'

不相关,但我还建议使用显式连接语法:我认为你会发现它使查询更容易阅读,因为它将JOIN逻辑与WHERE逻辑分开:

select a.refe_id  from a
join c on a.owln_code = c.code
join b on c.con_id =  b.pers_id
where (:PARAM IS NULL OR regexp_like(:PARAM, '(^|)' || b.con_abbrv|| '(|$)'))
  and a.status = '01'