gpt4 book ai didi

sql - PL/SQL 将一个字符串按 "+ "拆分并将其中的数字相加?

转载 作者:行者123 更新时间:2023-12-02 06:31:08 24 4
gpt4 key购买 nike

CREATE OR REPLACE FUNCTION sumNumbers(p VARCHAR2) RETURN NUMBER IS

...

SELECT sumNumbers('3 + 6 + 13 + 0 + 1') FROM dual;

所以输出应该是:23

最佳答案

您可以使用带有 XML 和 XPath 评估的“技巧”来执行此操作,而无需手动标记字符串:

select * from xmltable('3 + 6 + 13 + 0 + 1' columns result number path '.');

RESULT
----------
23

或者:

select to_number(xmlquery('3 + 6 + 13 + 0 + 1' returning content).getStringVal()) as result
from dual;

RESULT
----------
23

这更灵活,因为可以使用其他运算符:

select * from xmltable('2 * (5 + 7) - 3' columns result number path '.');

RESULT
----------
21

虽然它不喜欢使用普通的 / 运算符进行除法,但您需要使用 div 来代替,因此您可能需要对源字符串进行替换如果它可能包含斜杠:

select * from xmltable('2 * (5 + 7) div 3' columns result number path '.');

RESULT
----------
8

阅读更多关于 Oracle's XPath handling 的信息, 和 XPath numeric operators .

你可以直接调用它,不需要函数;但是如果你特别想把它包装在一个函数中,它会稍微复杂一些,因为 XPath 必须在解析时固定,所以你需要使用动态 SQL:

CREATE OR REPLACE FUNCTION sumNumbers(p VARCHAR2) RETURN NUMBER IS
l_result NUMBER;
BEGIN
execute immediate q'[select * from xmltable(']'
|| replace(p, '/', ' div ')
|| q'[' columns result number path '.')]'
into l_result;

return l_result;
END;
/

SELECT sumNumbers('3 + 6 + 13 + 0 + 1') FROM dual;

SUMNUMBERS('3+6+13+0+1')
---------------------------------------
23

我用过 the alternative quoting mechanism以避免在语句中转义单引号,但我不确定这里是否更清楚。我已经包含了 replace() 以防你需要能够除法,但如果你不想要它,那么只需将 p 直接连接到 SQL 语句中.通过替换,您可以执行以下操作:

SELECT sumNumbers('2 * (5 + 7) / 3') FROM dual;

如果你想让它变得灵活,函数应该有一个不同的名字......

关于sql - PL/SQL 将一个字符串按 "+ "拆分并将其中的数字相加?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36884473/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com