我可以编写一个行为类似于REGEXP_LIKE的函数,即其结果类型的行为是布尔值吗?

时间:2016-05-26 12:26:04

标签: oracle

在Oracle中,通常应返回true / false的SQL函数返回1/0,因为BOOLEAN数据类型仅存在于PL / SQL块中。

例如,对于Oracle Text,您不能忘记> 0中的 SELECT * FROM bartbl WHERE CONTAINS(foocol, 'sometext') > 0 。否则,您将获得ORA-00920无效的关系运算符。

但是,REGEXP_LIKE似乎表现得像一个真正的布尔值:你可以做SELECT * FROM bartbl WHERE REGEXP_LIKE(foocol, 'sometext')并且它可以工作。

所以我想知道为什么会这样,如果有可能我写这样的函数呢?

2 个答案:

答案 0 :(得分:1)

曾几何时,ANSI SQL中没有布尔要求(不确定最新标准中是否存在该要求?),Oracle有时会做自己的事情;)但是,我个人认为没有问题使用Y / N或1/0。

无论如何,REGEXP_LIKE实际上是一种过滤器(可以减少返回的行数),与典型函数(它将为其处理的每一行返回一个值(或null))不同。但好的是,如果您真的想模仿过滤器功能,可以将REGEXP_LIKE与您自己的功能一起使用。例如:

create or replace function is_big_number(i_num in number)
return varchar2
as

begin
  if (i_num >= 1000000) then
    return 'Y';
  end if;
  return 'N';
end;

with x as (
  select 50000 as num from dual
  union all
  select 1000000 as num from dual
  union all
  select 3 as num from dual
)
select num, is_big_number(num)
from x
-- this is a filter, not a typical "function"
where
regexp_like(is_big_number(num), 'Y');

输出:

NUM IS_BIG_NUMBER(NUM)
1000000 "Y"

希望有所帮助。

答案 1 :(得分:0)

Oracle的内置函数很特别,你不能自己写一个这样的函数。我不知道为什么呢