固定行标题(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

推荐

方法一最常用,易理解易维护。

posted @ 2025-06-01 16:00  灯熄帘摇月候身  阅读(27)  评论(0)    收藏  举报