ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

DECODE函数的奇怪用法的例子

2022-06-28 13:02:17  阅读:214  来源: 互联网

标签:NAME 用法 DECODE RECORD BOOK VALUES 例子 ID USER


背景:你们公司超级注重企业文化,要求大家要做好孩子多读书,公司老板叫王富贵,老板娘叫张翠花,另有员工若干人。

需求:领导要求搞一个员工读书记录排名,展示出每个员工所读过的书都有啥?

分析:从这样及其常见的一句话需求描述中,聪明的小趴菜你肯定知道,老板肯定要排在最前面,然后应该是老板娘,剩余的普通员工按照姓名首字母排等等这些隐藏的需求。

方案:

首先给出数据建表脚本(Oracle)

CREATE TABLE T_BOOK_RECORD (
    ID VARCHAR2(100) NOT NULL,
    USER_NAME VARCHAR2(100) NOT NULL,
    BOOK_NAME VARCHAR2(100) NOT NULL,
    CONSTRAINT T_BOOK_RECORD_PK PRIMARY KEY (ID)
);
COMMENT ON TABLE T_BOOK_RECORD IS '阅读记录';
COMMENT ON COLUMN T_BOOK_RECORD.ID IS '主键';
COMMENT ON COLUMN T_BOOK_RECORD.USER_NAME IS '人员姓名';
COMMENT ON COLUMN T_BOOK_RECORD.BOOK_NAME IS '书籍名称';

然后给出灵魂数据脚本

INSERT INTO T_BOOK_RECORD (ID, USER_NAME, BOOK_NAME) VALUES('1', '王富贵', '《如何合法罚款》');
INSERT INTO T_BOOK_RECORD (ID, USER_NAME, BOOK_NAME) VALUES('2', '李加成', '《舔狗的自我修养》');
INSERT INTO T_BOOK_RECORD (ID, USER_NAME, BOOK_NAME) VALUES('3', '孙正易', '《囚徒健身插图版》');
INSERT INTO T_BOOK_RECORD (ID, USER_NAME, BOOK_NAME) VALUES('4', '王丝匆', '《穷爸爸富爸爸》');
INSERT INTO T_BOOK_RECORD (ID, USER_NAME, BOOK_NAME) VALUES('5', '赵伪', '《资本游戏》');
INSERT INTO T_BOOK_RECORD (ID, USER_NAME, BOOK_NAME) VALUES('6', '王富贵', '《人家大爱-996福报》');
INSERT INTO T_BOOK_RECORD (ID, USER_NAME, BOOK_NAME) VALUES('7', '张翠花', '《拴住老公的胃》');
INSERT INTO T_BOOK_RECORD (ID, USER_NAME, BOOK_NAME) VALUES('8', '张翠花', '《老板娘不是老板的娘》');
INSERT INTO T_BOOK_RECORD (ID, USER_NAME, BOOK_NAME) VALUES('9', '李加成', '《老子明天不上班》');
INSERT INTO T_BOOK_RECORD (ID, USER_NAME, BOOK_NAME) VALUES('10', '王丝匆', '《投胎那些事》');

你最开始可能想到的方法

  • 首先,按照姓名排序查出所有数据
SELECT USER_NAME ,BOOK_NAME FROM T_BOOK_RECORD ORDER BY NLSSORT(USER_NAME,'NLS_SORT = SCHINESE_PINYIN_M')

得到结果如下:

 

 

  • 然后,通过代码筛选出老板王富贵和老板娘张翠花的数据依次塞到一个集合里
public List<BookRecord> list(){
    List<BookRecord> boss = new ArrayList<>();
    List<BookRecord> bossWife = new ArrayList<>();
    List<BookRecord> nobody = new ArrayList<>();
    for(BookRecord br : list){
        if ("王富贵".equals(br.getUserName())){
            boss.add(br);
        }else if ("张翠花".equals(br.getUserName())){
            bossWife.add(br);
        }else {
            nobody.add(br);
        }
    }
    boss.addAll(bossWife);
    boss.addAll(nobody);
    
    return boss;
}

其实也可以一个并不复杂的SQL直接实现

SELECT * FROM T_BOOK_RECORD ORDER BY DECODE(USER_NAME,'王富贵',1,'张翠花',2) ,NLSSORT(USER_NAME,'NLS_SORT = SCHINESE_PINYIN_M')

得到结果如下:

 

 

这里主要有以下几个知识点:

  • 字段按照拼音字母排序
SELECT * FROM T_BOOK_RECORD ORDER BY NLSSORT(USER_NAME,'NLS_SORT = SCHINESE_PINYIN_M')
  • 动态处理函数decode(),这个有点类似三目运算表达式

DECODE(USER_NAME,'王富贵',1,'张翠花',2),这个代表,如果USER_NAME='王富贵',函数返回1,如果USER_NAME='张翠花',函数返回2,这个函数的返回值是优先级最高的排序条件

标签:NAME,用法,DECODE,RECORD,BOOK,VALUES,例子,ID,USER
来源: https://www.cnblogs.com/java-bhp/p/16419036.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有