在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')
并且它可以工作。
所以我想知道为什么会这样,如果有可能我写这样的函数呢?
答案 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的内置函数很特别,你不能自己写一个这样的函数。我不知道为什么呢