打印字符列表中较大的字母的位置
问题描述:
我对这个任务有一些逻辑思考的麻烦。 因此,任务要求返回字母列表中第一个较大的字母的位置。 例如:打印字符列表中较大的字母的位置
ABVD -> 3
BCDG -> 4
CFDE -> 2
这个任务建议使用lenght,ASCII,并命名为块,功能
原来这就是我到目前为止做:
declare
x varchar2(10) :='ABFD';
BEGIN
FOR i in 1..length(x) LOOP
dbms_output.put_line(ASCII(SUBSTR(x, i, 1)));
END LOOP;
END;
我的想法是,以将字母转换为数字:65,66,70,68。该模式是x + 1,并且由于数字70不等于66 + 1,所以程序将返回该数字的位置,即3. 不幸的是,我不知道如何将这个想法变成代码。你能给我一些提示/建议吗?谢谢!
答
在问题陈述中,您说过“...使用命名块,功能”。
您的解决方案是一个匿名程序。它不是以任何名称命名的(这就是为什么它被称为“匿名”)。它不是一个函数 - 它不返回任何东西。
我会让你学习文档来理解函数和过程之间的区别,以及如何命名函数或过程。下面我会跟随你的主角,并展示如何修改你的代码,使其成为一个可行的匿名程序。 (在程序中“打印”ind
的最终值;当您将其更改为某个功能时,应该为return
表示该值,而不是打印它。)
在您发布的代码中,您正在打印字母输入字符串,一个接一个。你甚至没有试图定义或分配给一个整数(字符串中“最高”字母的第一个出现的索引)。这应该在DECLARE块中完成。然后,我们还需要存储“迄今为止”找到的最高字母(以备将来比较)。
的代码可能是这样的:
declare
x varchar2(10) :='ABFD';
ind number := 1;
max_letter char(1) := substr(x, 1, 1);
BEGIN
FOR i in 2..length(x) LOOP
if substr(x, i, 1) > max_letter
then max_letter := substr(x, i, 1);
ind := i;
end if;
END LOOP;
dbms_output.put_line(ind);
END;
/
注意字母可以相互比较直接,没有任何理由将它们转换为数字。
答
纯SQL使用示范条款
with t(str) as
(select 'ABVD' from dual
union all select 'BCDG' from dual
union all select 'CFDE' from dual)
select str, instr(str, max_chr) ind
from t
model
partition by (rownum rn)
dimension by (1 dummy)
measures (str, chr(1) max_chr)
rules
iterate (4e3) until (substr(str[1], iteration_number + 2, 1) is null)
(max_chr[1] = greatest(max_chr[1], substr(str[1], iteration_number + 1, 1)));
STR IND
---- ----------
ABVD 3
BCDG 4
CFDE 2
为什么转换为数字?是的,70> 65,但'F'>'A'也是。 –
感谢您的回复!我不知道我们实际上可以做到这一点。 – Chopsticks