查询结果排序

本章节主要介绍 DM 数据库查询结果排序使用技巧及案例。案例包括:按子串排序、字符串替换、字符串混合排序及按指定列排序。

适用场景

软件 版本
操作系统 Redhat 7 及以上版本
DM 数据库 DM 8.0 及以上版本
CPU 架构 x86、ARM、龙芯、飞腾等国内外主流 CPU

操作方法

以指定的次序返回查询结果

为提高查询结果可读性,我们可以对查询结果按照一定顺序排列,例如:按员工生日进行升序排列。示例语句如下所示:

  SELECT employee_name, hire_date
    FROM dmhr.employee
   WHERE ROWNUM < 5
ORDER BY hire_date ASC;

输出结果如下图所示:

指定次序返回

也可以将列名替换成数字,例如 ORDER BY 2 ASC,意思是按第二列进行升序排序。示例语句如下所示:

  SELECT employee_name, hire_date
    FROM dmhr.employee
   WHERE ROWNUM < 5
ORDER BY 2 ASC;

按多个字段排序

如果想实现按照员工编号升序,薪资降序进行排列,可以在 order by 后加两列,并分别标明 ASC, DESC。其中 ASC 表示升序,DESC 表示降序。示例语句如下所示:

  SELECT employee_name, hire_date, salary
    FROM dmhr.employee
   WHERE ROWNUM < 5
ORDER BY 2 ASC, 3 DESC;

输出结果如下图所示:

多个字段返回

注意

多列排序,若前面的列有重复(如 hairdate = '2002-05-02' 有 6 行数据)后面的排序才有用。即先通过前面的列将数据分组,再按照后面的列进行排序。

按子串排序

如果想按照客户手机号尾号的顺序排列,缩小查询范围,可以通过如下函数实现子串排序。示例语句如下所示:

  SELECT EMPLOYEE_NAME AS 姓名, SUBSTR (PHONE_NUM, -4) AS 尾号
    FROM dmhr.employee
   WHERE ROWNUM < 5
ORDER BY 2;

输出结果如下图所示:

子串排序

由此可见,只要能将数据查询出来,就能够对输出结果按照相应的要求进行排序。

TRANSLATE 应用

TRANSLATE 应用广泛,可实现字符替换。语法格式如下:

TRANSLATE(expr,from_string,to_string)

from_string 与 to_string 以字符为单位,对应字符逐个替换。示例语句如下所示:

SELECT TRANSLATE ('ab你好bcadefg', 'abcdefg', '1234567') AS new_str FROM DUAL;

输出结果如下图所示:

translate 语法

如果 to_string 为空,则直接返回空值。示例语句如下所示:

SELECT TRANSLATE('ab你好bcadefg','abcdefg','') AS new_str FROM DUAL;

输出结果如下图所示:

translate 语法

如果 to_string 对应的位置没有字符,from_string 中列出的字符将会被删除。示例语句如下所示:

SELECT TRANSLATE('ab你好bcadefg','1abcdefg','1') AS new_str FROM DUAL;

输出结果如下图所示:

translate 语法

按数字和字母混合字符串中的字母排序

为了实现混合字符串排序,首先需创建如下视图:

CREATE OR REPLACE VIEW v AS
   SELECT postal_code || ' ' || city_id AS data FROM dmhr.location;

查询视图信息,示例语句如下所示:

SELECT * FROM v;

我们可以使用 translate 替换功能,把数字和空格都替换为空,然后再进行排序。示例语句如下所示:

  SELECT data, TRANSLATE (data, '- 0123456789', '-') AS oper_type
    FROM v
   WHERE ROWNUM < 5
ORDER BY 2;

输出结果如下图所示:

混合字符串排序

根据指定条件排序

如需将工资在 6000~8000 之间的员工排列在靠前位置,以便优先查看。我们可以在查询中新生成一列,实现指定条件排序。示例语句如下所示:

  SELECT job_title AS 职务,
         CASE WHEN min_salary >= 6000 AND min_salary <= 8000 THEN 1 ELSE 2 END
            AS 级别,
         min_salary AS 工资
    FROM dmhr.job
   WHERE ROWNUM < 5
ORDER BY 2, 3;

输出结果如下图所示:

根据条件排序

参考文献

更多 SQL 语言使用说明,请参考《DM_SQL 语言使用手册》,手册位于数据库安装路径 /dmdbms/doc 文件夹下。如有其他问题,请在社区内咨询。

微信扫码
分享文档
扫一扫
联系客服