我正在尝试制定一个(对我来说)困难的字符串算法。
所以这一切都以一个数字开始(长度可以是可变的&&是varchar)。
步骤是:
- 将数字分成 4 组(最后一组可以少于 4)
- 颠倒组顺序
- 删除空格
经过几个小时的努力,我到目前为止只能将数字分成几组。
DECLARE
text VARCHAR2(50);
newText VARCHAR2(50);
BEGIN
text := '3536 2029 2712 3456 789';
FOR i IN 0..LENGTH(text) LOOP
IF MOD(i, 4) = 0 THEN
newText := newText || ' ' || SUBSTR(text, i, 1);
ELSE
newText := newText || SUBSTR(text, i, 1);
END IF;
END LOOP;
dbms_output.put_line(newText);
END;
/
Output: 3353 6202 9271 2345 6789
我在过去几个小时里尝试过的是;我首先认为最简单的方法应该是将长文本分成几组并将它们添加到一个数组中,然后简单地反转数组。老实说,这对我来说根本不起作用(甚至没有接近)。因此我想出了这个。
你能帮我吗?抱歉,我是新手,今天开始在 plsqy 上。 如果我可以提供一些额外的信息,我很高兴您也发布此信息。
附注
我什至不需要确切的代码示例。一些指导性的帮助将会有很大的帮助。
问候
最佳答案
不需要时不必费心处理过程代码,您可以使用简单的 SQL 查询进行相同的转换:
SELECT
LISTAGG(GRP) WITHIN GROUP (ORDER BY RN DESC) RESULT
FROM (
SELECT
SUBSTR(VALUE, (LEVEL - 1) * 4 + 1, 4) GRP,
ROWNUM RN
FROM
(SELECT '3536202927123456789' VALUE FROM DUAL)
CONNECT BY
SUBSTR(VALUE, (LEVEL - 1) * 4 + 1) IS NOT NULL
)
PL/SQL:
DECLARE
text VARCHAR2(50);
newText VARCHAR2(50);
BEGIN
text := '3536202927123456789';
FOR i IN 0..TRUNC(LENGTH(text) / 4) LOOP
newText := SUBSTR(text, i * 4 + 1, 4) || newText;
END LOOP;
dbms_output.put_line(newText);
END;
或
DECLARE
text VARCHAR2(50) := 3536202927123456789;
newText VARCHAR2(50);
BEGIN
SELECT
LISTAGG(GRP) WITHIN GROUP (ORDER BY RN DESC) INTO newText
FROM (
SELECT
SUBSTR(VALUE, (LEVEL - 1) * 4 + 1, 4) GRP,
ROWNUM RN
FROM
(SELECT text VALUE FROM DUAL)
CONNECT BY
SUBSTR(VALUE, (LEVEL - 1) * 4 + 1) IS NOT NULL
);
dbms_output.put_line(newText);
END;
关于oracle - pl sql 尝试创建字符串算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33838397/