sql自定义多条件排序规则及优化思路

sql自定义排序规则

一、mysql自定义排序规则

使用field函数

使用格式

select * from 表名 order by field(字段名称,字段值1,字段值2..)

举例:在员工中排序按 领导,正式员工,试用员工,实习生 顺序排序

select * from emp order by field(postName,'领导','正式员工','试用员工','实习生')

如果有多个排序条件规则可以使用逗号分隔

select * from 表名 order by field(字段名称1,字段值1,字段值2..),field(字段名称2,字段值1,字段值2..)

二、oracle自定义排序规则

使用decode函数

使用格式:

select * from 表名 order by decode(字段名称,字段值1,优先级值,字段值2,优先级2...);

场景举例:展示员工信息,排序规则如下:

1、先按部门排序,创新事业部,研发中心,信息化事业部置前,其他部门置后

2、按岗位排序:部门经理,项目经理,Java开发工程师,前端开发工程师,测试开发工程师,运维开发工程师置前,其他岗位置后;

3、最后按入职时间排序;

ORDER BY
        decode(DEPART_NAME,'业务创新事业部',1,'研发中心',2,'信息化事业部',3),
        decode(POST_NAME, '部门经理',1,'项目经理',2,'java开发工程师',3,'前端开发工程师',4,'测试开发工程师',5,'运维工程师',6),
        ENTRY_DATE desc

三、优化

可以发现sql语句存在硬编码,可以通过新建一张参数表,与之关联,修改表数据来修改排序规则

(0)员工表信息

DROP TABLE IF EXISTS `user`;
CREATE TABLE `user`  (
  `id` int NULL DEFAULT NULL,
  `username` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL,
  `password` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL,
  `post` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;

-- ----------------------------
-- Records of user
-- ----------------------------
INSERT INTO `user` VALUES (1, '张三', '12345', '项目经理');
INSERT INTO `user` VALUES (2, '李四', '123456', '项目经理');
INSERT INTO `user` VALUES (3, '王五', '123456', 'Java开发工程师');
INSERT INTO `user` VALUES (11, '罗翔', '123445', '测试开发工程师');
INSERT INTO `user` VALUES (12, '张杰', '123456', '公司领导');
INSERT INTO `user` VALUES (13, '汤家凤', '123456', '前端开发工程师');
INSERT INTO `user` VALUES (14, '邓超', '123456', '前端开发工程师');
INSERT INTO `user` VALUES (24, '周杰伦', '123456', '人事专员');
INSERT INTO `user` VALUES (34, '邓紫棋', '123456', '项目经理');

实现过程:

(1) 新建参数表 parameter并插入数据

CREATE TABLE `parameter` (
  `id` int NOT NULL AUTO_INCREMENT,
  `parameter_name` varchar(64) DEFAULT NULL, -- 参数名称
  `parameter_value` varchar(64) DEFAULT NULL, -- 参数值
  `sort_num` int DEFAULT NULL,
  PRIMARY KEY (`id`)
);
INSERT INTO `parameter` VALUES (1, 'post', '公司领导', 1);
INSERT INTO `parameter` VALUES (2, 'post', '项目经理', 2);
INSERT INTO `parameter` VALUES (3, 'post', 'java开发工程师', 3);
INSERT INTO `parameter` VALUES (4, 'post', '前端开发工程师', 4);
INSERT INTO `parameter` VALUES (5, 'post', '人事专员', 5);
INSERT INTO `parameter` VALUES (6, 'department', '业务创新事业部', 1);
INSERT INTO `parameter` VALUES (7, 'department', '研发中心', 2);
INSERT INTO `parameter` VALUES (8, 'department', '信息化事业部', 3);
INSERT INTO `parameter` VALUES (9, 'department', '财务部', 4);
INSERT INTO `parameter` VALUES (10, 'post', '技术组长', 6);
INSERT INTO `parameter` VALUES (11, 'post', '测试开发工程师', 7);

(2)参数表中存入所有岗位名称信息(数据中有岗位,部门两块信息),其中sort_num为优先级大小

在这里插入图片描述

(3)员工表与参数表关联

SELECT
	user.* ,p.sort_num
FROM
USER
LEFT JOIN
parameter p
on
p.parameter_value = user.post
ORDER BY
p.sort_num asc

查询出的结果为:

在这里插入图片描述

当排序规则发生变化时,可以通过修改表数据进行调整,更灵活更便于维护

note:参数表中parameter_name = 'post’所对应的parameter_value的值为所有的岗位信息,即参数表的岗位信息 >= 员工表中岗位信息

(建的数据库表比较随意,只是为了给大家提供一种优化思路哈)

参照文章:https://blog.csdn.net/hscch/article/details/82348621

对于实现 SQL 语句的自动补全功能,可以采用以下思路: 1. 数据收集:收集大量的 SQL 语句样本,包括常见的查询语句、插入语句、更新语句等。可以通过爬取开源项目、收集用户反馈等方式获取。 2. 数据预处理:对收集到的 SQL 语句进行预处理,包括分词、去除停用词、标记化等步骤。这可以使用现有的开源工具或自定义脚本来完成。 3. 建立索引:将预处理后的 SQL 语句建立索引,可以使用倒排索引或其他合适的数据结构来存储。索引的目的是提高查询效率和准确性。 4. 查询匹配:当用户输入部分 SQL 语句时,通过查询索引,寻找与用户输入最相似的 SQL 语句。可以使用字符串匹配算法(如 Levenshtein 距离)或基于向量化的相似度计算方法(如余弦相似度)。 5. 结果排序:根据查询匹配的相似度,对结果进行排序,将最匹配的 SQL 语句推荐给用户。可以根据相关度、用户历史查询记录等因素进行排序。 6. 用户反馈:根据用户的选择和反馈,不断优化和更新索引,提高自动补全的准确性和用户体验。 以上是一个基本的实现思路,具体的实现可以根据需求和技术栈进行调整和优化。需要注意的是,SQL 语句的自动补全功能是一个复杂的任务,需要考虑语法规则、上下文等因素,因此可能需要借助 SQL 解析器和相关领域的知识来实现更精确的结果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值