固定行标题(FR中无论有数据都显示该行标题)
固定行标题
问题
SQL数据处理中,无论当日有无数据,都需要显示固定的行标题。
解决方案
方法一:UNION ALL + LEFT JOIN
-- 核心就是使用了左连接的特性
select a.*, b.*
from (
select '标题1' columnA from dual union all
select '标题2' from dual union all
select '标题N' from dual
) a
left join (
select * from 实际数据表
) b on a.columnA = b.columnT
说明:
- 表a部分可用字典表替代
- 需要排序时可添加序号列
方法二:自定义函数
-- 创建类型:定义一个varchar2的表类型,用于返回分割后的字符串数组
create or replace type varchar2_table as table of varchar2(4000);
-- 创建split函数:将字符串按分隔符分割成多行
create or replace function test_split(p_str varchar2, p_delimiter varchar2 default ',')
return varchar2_table pipelined -- pipelined:管道函数,可以像表一样查询
as
l_str varchar2(32767) := p_str || p_delimiter; -- 在原字符串末尾添加分隔符,便于处理
l_pos number; -- 存储分隔符的位置
begin
loop -- 开始循环处理
l_pos := instr(l_str, p_delimiter); -- 查找下一个分隔符的位置
exit when l_pos = 0; -- 如果没找到分隔符,退出循环
pipe row(substr(l_str, 1, l_pos - 1)); -- 提取分隔符前的字符串并返回
l_str := substr(l_str, l_pos + 1); -- substr(字符串, 起始位置) 从位置开始到末尾,去掉已处理部分
end loop;
return; -- 函数结束
end;
-- 使用函数:将逗号分隔的字符串转换为多行数据
select * from table(test_split('标题1,标题2,标题3'))
方法三:正则表达式
select regexp_substr('字,符,串,组', '[^,]+', 1, level, 'i')
from dual
connect by level <= length('字,符,串,组') - length(regexp_replace('字,符,串,组', ',', '')) + 1
推荐
方法一最常用,易理解易维护。


浙公网安备 33010602011771号