Oracle测试功能

问题描述

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

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...