Oracle 23.26.4 新函数 BAR_CHART:把数字画成条形图

笔者最近发现,Oracle 在 23.26.4 版本中引入了一个挺有意思的函数 BAR_CHART。它能把数值或布尔值直接渲染成由字符组成的条形,在 SQL 结果里就能看到直观的图形。

官方对它的描述是:可以用 BAR_CHART 把数值或布尔值显示为字符条,并能指定条形代表的区间、宽度以及绘制用的字符。

01 | 基本语法

函数的可用参数如下:

sql 复制代码
BAR_CHART(value, maximum, minimum, width, symbol)

其中 value 是要展示的值,maximum 和 minimum 定义条形所代表的区间,width 是条形的宽度,symbol 是绘制条形所用的字符。

02 | 用薪资数据试一试

先对员工表的 sal 做展示,把薪资除以 50 后交给函数,其余参数使用默认值(默认区间与宽度以所用版本官方文档为准):

sql 复制代码
SELECT ename, sal, BAR_CHART(sal/50) FROM emp;

它同样支持 emoji。下面用布尔判断配合 `` 标记高薪员工:

sql 复制代码
SELECT ENAME, sal,
  BAR_CHART(sal >= 3000, 1, 0, 1, '') AS high_salary
FROM emp;

03 | 玩得更花一些

把区间、宽度和字符组合起来,还能做出分段阈值条。下面的例子用三种颜色区分薪资区间:以 2000 和 3000 为分界,分别用 、、 三段条形拼接(边界值具体落在哪一段以实际渲染结果为准),再用 || 拼接起来:

sql 复制代码
SELECT
  ename,
  job,
  sal,
  bar_chart(sal) AS default_bar,
  bar_chart(sal, 5000, 0, 10) AS "10_CHAR_BAR",
  bar_chart(sal, 2000, 0, 5, '')
  || bar_chart(sal, 3000, 2000, 5, '')
  || bar_chart(sal, 5000, 3000, 5, '') AS threshold_bar,
  bar_chart(sal, 5000, 0, 5, '') AS "wage"
FROM emp
ORDER BY sal;

04 | 没有 emp 表怎么办

文中用 emp 表举例。如果手头没有这张表,可以在测试环境中用下面的 SQL 快速构建 scott 版本的 emp 表并插入测试数据(执行前请确认当前 schema 下不存在同名表,避免冲突):

sql 复制代码
CREATE TABLE emp (
    empno    NUMBER(4) PRIMARY KEY,
    ename    VARCHAR2(10),
    job      VARCHAR2(9),
    mgr      NUMBER(4),
    hiredate DATE,
    sal      NUMBER(7,2),
    comm     NUMBER(7,2),
    deptno   NUMBER(2)
);

INSERT INTO emp VALUES (7369,'SMITH','CLERK',7902,TO_DATE('1980-12-17','YYYY-MM-DD'),800,NULL,20);
INSERT INTO emp VALUES (7499,'ALLEN','SALESMAN',7698,TO_DATE('1981-02-20','YYYY-MM-DD'),1600,300,30);
INSERT INTO emp VALUES (7521,'WARD','SALESMAN',7698,TO_DATE('1981-02-22','YYYY-MM-DD'),1250,500,30);
INSERT INTO emp VALUES (7566,'JONES','MANAGER',7839,TO_DATE('1981-04-02','YYYY-MM-DD'),2975,NULL,20);
INSERT INTO emp VALUES (7654,'MARTIN','SALESMAN',7698,TO_DATE('1981-09-28','YYYY-MM-DD'),1250,1400,30);
INSERT INTO emp VALUES (7698,'BLAKE','MANAGER',7839,TO_DATE('1981-05-01','YYYY-MM-DD'),2850,NULL,30);
INSERT INTO emp VALUES (7782,'CLARK','MANAGER',7839,TO_DATE('1981-06-09','YYYY-MM-DD'),2450,NULL,10);
INSERT INTO emp VALUES (7788,'SCOTT','ANALYST',7566,TO_DATE('1987-04-19','YYYY-MM-DD'),3000,NULL,20);
INSERT INTO emp VALUES (7839,'KING','PRESIDENT',NULL,TO_DATE('1981-11-17','YYYY-MM-DD'),5000,NULL,10);
INSERT INTO emp VALUES (7844,'TURNER','SALESMAN',7698,TO_DATE('1981-09-08','YYYY-MM-DD'),1500,0,30);
INSERT INTO emp VALUES (7876,'ADAMS','CLERK',7788,TO_DATE('1987-05-23','YYYY-MM-DD'),1100,NULL,20);
INSERT INTO emp VALUES (7900,'JAMES','CLERK',7698,TO_DATE('1981-12-03','YYYY-MM-DD'),950,NULL,30);
INSERT INTO emp VALUES (7902,'FORD','ANALYST',7566,TO_DATE('1981-12-03','YYYY-MM-DD'),3000,NULL,20);
INSERT INTO emp VALUES (7934,'MILLER','CLERK',7782,TO_DATE('1982-01-23','YYYY-MM-DD'),1300,NULL,10);

COMMIT;

这个函数用起来挺有意思,感兴趣的可以自己动手试试看。


关注我,和AI一起成长~