问题描述
Oracle中是否有一个内置功能以类似的方式工作?
CREATE OR REPLACE FUNCTION IFTrueValue(iValue NUMBER,sOper VARCHAR2,iTest NUMBER,iTrue NUMBER) RETURN NUMBER AS
bCond BOOLEAN;
BEGIN
EXECUTE IMMEDIATE 'SELECT CASE WHEN ' || iValue || sOper || iTest || ' THEN 1 ELSE 0 END FROM dual' INTO bCond;
RETURN CASE bCond
WHEN TRUE THEN iTrue
ELSE iValue
END;
END;
/
SELECT IFTrueValue(Mod(20,20),'=',20) FROM dual; -- return 20
SELECT IFTrueValue(Mod(25,20) FROM dual; -- return 5: Mod(25,20)
解决方法
您可以为此使用xmltable / xmlquery。
带有示例数据的完整示例:
with t(iValue,sOper,iTest,iTrue) as (
select Mod(20,20),'=',20 from dual union all
select Mod(25,'>',13 from dual
)
select
t.*,xmlcast(
xmlquery(
('if ($iValue '||sOper||' $iTest)
then $iTrue
else $iValue
')
passing
iValue as "iValue",iTest as "iTest",iTrue as "iTrue"
returning content
)
as number
)test_function
from
t
结果:
IVALUE SOPER ITEST ITRUE TEST_FUNCTION
---------- ----- ---------- ---------- -------------
0 = 0 20 20
5 = 0 20 5
5 > 0 13 13