【问题标题】:Oracle test functionOracle 测试功能
【发布时间】:2020-12-09 19:26:54
【问题描述】:

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), '=', 0, 20) FROM dual; -- return 20
SELECT IFTrueValue(Mod(25, 20), '=', 0, 20) FROM dual; -- return 5: Mod(25, 20)

【问题讨论】:

  • 这个功能有什么问题?
  • 功能没问题,想知道是有一个还是只有内置一个

标签: sql oracle function plsql


【解决方案1】:

您可以为此使用 xmltable/xmlquery。

带有样本数据的完整示例:

with t(iValue, sOper, iTest, iTrue) as (
  select Mod(20, 20), '=', 0, 20 from dual union all
  select Mod(25, 20), '=', 0, 20 from dual union all
  select Mod(25, 20), '>', 0, 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多