sql - 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), '=', 0, 20) FROM dual; -- return 20
SELECT IFTrueValue(Mod(25, 20), '=', 0, 20) FROM dual; -- return 5: Mod(25, 20)
解决方案
您可以为此使用 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
推荐阅读
- html - 使用正则表达式获取所有 js href
- elasticsearch - 使用循环在elasticSearch中查找和替换字符串
- python - 为什么 HuggingFace 的 Bart Summarizer 会复制给定的输入文本?
- mysql - 只有几列联合的最大值(值)
- python - 定义默认关键字值以在 python 中的字典中起作用
- file - Tcl 字符串到二进制文件的中间而不覆盖其内容
- html - 如何为图像添加图层?
- python - shutil.rmtree 不会删除所有文件和文件夹
- matplotlib - 使用 matplotlib 绘制 3D 向量场
- ssl - 在 Tomcat 上安装 SSL,其中 IIS 已在同一服务器上运行并配置了 SSL