sql - PL/SQL LOOP - 返回包含混合大写字母的行
问题描述
我知道这个问题可能有一个简单的答案,但我无法理解它。我试图在一个循环中返回一个混合了大写字母和非大写字母的字符串(在 SQL 输出中)。
示例:如果行中的名称是 John Doe,则输出将打印 JoHn DoE 或 MiXeD CapiTaL。这是我的代码(我知道写得不好,但我需要使用光标!):
declare
aa_ VARCHAR2(2000);
bb_ NUMBER:=0;
cc_ NUMBER:=0;
CURSOR cur_ IS
SELECT first_name namn, last_name efternamn FROM person_info
;
begin
FOR rec_ IN cur_ LOOP
dbms_output.put_line(rec_.namn);
FOR bb_ IN 1.. LENGTH(rec_.namn) LOOP
dbms_output.put(UPPER(SUBSTR(rec_.namn,bb_,1)));
cc_ := MOD(bb_,2);
IF cc_ = 0 THEN
dbms_output.put(UPPER(SUBSTR(rec_.namn,cc_,1)));
ELSE
dbms_output.put(LOWER(SUBSTR(rec_.namn,2)));
END IF;
end loop;
dbms_output.new_line;
end loop;
end;
再一次,我知道代码真的很糟糕,但是,是的,努力学习!
提前致谢 :)
解决方案
您可以为此目的使用纯 SQL,而无需任何循环:
- 将输入文本成对分割,并用一些特殊字符(未出现在文本中)分隔。
- 使用
initcap
SQL 函数将每个首字母转为大写。 - 删除特殊分隔符。
with a as ( select 'John Doe' as a from dual union all select 'mixed capital and non-capital letters' from dual ) select replace( initcap( /*Convert case*/ regexp_replace(a, '([a-zA-Z]{2})', /*Add ASCII nul after each two letters*/ '\1' || chr(0) ) ), /*Remove ASCII nul to revert changes*/ chr(0) ) as mixed_case from a
| 混合案例 | | :------------------------------------------------ | | 约翰·多伊 | | 混合大写和非大写字母 |
db<>在这里摆弄
推荐阅读
- javascript - 有没有办法让文本隐藏在输入框中?
- google-app-engine - 如何在 App Engine 标准上部署 gRPC?
- php - 如何在 .htaccess 中使用一行代码隐藏 php 扩展
- c++ - c ++删除存储在向量中的链表的多个头/尾
- javascript - React:处理 OnMouseDown 和 OnMouseUp 之间状态变化的更快方法?
- async-await - Kendo UI 数据源 - beforeSend 与 async/await
- sql-server - 如何找出存储过程每次运行的时间
- amazon-web-services - AWS CloudFormation 堆栈:具有嵌套路径的 API Gateway 资源?
- docker - 如何协调 docker 容器之间的端口
- sql - 将 SQL 语句组合为列,而不是行