无需公式多条件查询,工作轻松无需加班
2023-11-27 06:27:07
很多人一看到“多条件查询”四个字,脑子第一个想到的一定是公式。背过公式的都知道,查询公式里好像跟“多条件”沾边儿的字儿就只有两个:AND和OR。
“我们今天就不用公式。”这话一出,有多少人惊得手里的咖啡杯都扣翻了?
说不用公式不用,真的不用。我们可以用SQL的两个系统函数:COALESCE() 和 IIF()。
COALESCE() 系统函数:用来做数据回填,返回字段里第一个不为空的值。语法:COALESCE(要检查的字段1,要检查的字段2)。
IIF() 系统函数:用来实现三元运算,用于条件判断。语法: IIF(判断条件,结果1,结果2)。
记不住没关系,用着用着就记不住了。
看一下效果图:
部门 | 姓名 | 籍贯 | 基本月薪 |
---|---|---|---|
质保部 | 张敏 | 辽宁 | 7000 |
信息部 | 张敏 | 陕西 | 8000 |
质保部 | 王苗苗 | 黑龙江 | 9000 |
质保部 | 吕伟伟 | 北京 | 10000 |
质保部 | 马丽丽 | 浙江 | 11000 |
信息部 | 周萌萌 | 河南 | 6000 |
信息部 | 孙蓓蓓 | 湖南 | 7000 |
质保部 | 秦天 | 上海 | 9000 |
信息部 | 俞晓晓 | 山东 | 10000 |
质保部 | 钱明明 | 江苏 | 11000 |
质保部 | 甄帅帅 | 河北 | 8000 |
信息部 | 马超超 | 陕西 | 7000 |
信息部 | 白雪雪 | 湖北 | 6000 |
信息部 | 凌云云 | 江苏 | 8000 |
信息部 | 杨薇薇 | 江苏 | 7000 |
质保部 | 闫冰 | 浙江 | 9000 |
质保部 | 夏阳 | 北京 | 10000 |
质保部 | 甄帅帅 | 辽宁 | 11000 |
↑查询结果↑
怎么样,是不是感觉跟“公式查询”的用起来差不太多?
这个表里的字段都是非常常见的,我们先写一个很简单的例子:
SELECT
COALESCE(
(SELECT dname
FROM department
WHERE dno = t.dno),
""
) AS dname,
COALESCE(
(SELECT ename
FROM employee
WHERE empno = t.empno),
""
) AS ename,
COALESCE(
(SELECT home
FROM employee
WHERE empno = t.empno),
""
) AS home,
COALESCE(
(SELECT basic
FROM salary
WHERE empno = t.empno),
""
) AS basic
FROM table t;
看看效果图:
部门 | 姓名 | 籍贯 | 基本月薪 |
---|---|---|---|
质保部 | 张敏 | 辽宁 | 7000 |
信息部 | 张敏 | 陕西 | 8000 |
质保部 | 王苗苗 | 黑龙江 | 9000 |
质保部 | 吕伟伟 | 北京 | 10000 |
质保部 | 马丽丽 | 浙江 | 11000 |
信息部 | 周萌萌 | 河南 | 6000 |
信息部 | 孙蓓蓓 | 湖南 | 7000 |
质保部 | 秦天 | 上海 | 9000 |
信息部 | 俞晓晓 | 山东 | 10000 |
质保部 | 钱明明 | 江苏 | 11000 |
质保部 | 甄帅帅 | 河北 | 8000 |
信息部 | 马超超 | 陕西 | 7000 |
信息部 | 白雪雪 | 湖北 | 6000 |
信息部 | 凌云云 | 江苏 | 8000 |
信息部 | 杨薇薇 | 江苏 | 7000 |
质保部 | 闫冰 | 浙江 | 9000 |
质保部 | 夏阳 | 北京 | 10000 |
质保部 | 甄帅帅 | 辽宁 | 11000 |
↑查询结果↑
对比两个表,看出来区别没?
查询结果一样,但代码量减少了一半儿多。
现在我们把表中的数据列增加到100000条,再次查询(为了模拟比较接近于实际工作中的情况,将查询条件增加为两个以上,增加条件分别是三个,而且让查询结果减少一些,免得查询结果表太多,便于对比两个代码的执行结果)。
使用查询公式查询,总执行时间3秒(不同时候执行时间会不同,此处只是说明公式查询的速度并为很慢)。
使用COALESCE() 和IIF() 系统函数查询,总执行时间1秒(不同时候执行时间会不同,此处只是说明函数的查询速度较快)。
像我们这种日常开发人员来说,数据库表里100000条数据的表简直是小菜一碟,十几秒就拉出来,平时的业务表都上好几百G了。
节省时间是显而易 militaires的。并且COALESCE() 和IIF() 系统函数查询执行时不会出现高延时,运行速度稳定有保障。
-- 多条件查询,查询结果:在质保部且姓名中包括“吕伟伟”或“闫冰”的
SELECT
COALESCE(
(SELECT dname
FROM department
WHERE dno = t.dno),
""
) AS dname,
COALESCE(
(SELECT ename
FROM employee
WHERE empno = t.empno),
""
) AS ename,
COALESCE(
(SELECT home
FROM employee
WHERE empno = t.empno),
""
) AS home,
COALESCE(
(SELECT basic
FROM salary
WHERE empno = t.empno),
""
) AS basic
FROM table t
WHERE
dno IN (
SELECT dno
FROM department
WHERE dname = '质保部'
)
AND
ename LIKE '吕伟伟'
OR
ename LIKE '闫冰';
速度快不重要,关键是方便呀!
只不过这个语法有点不太容易记,不用则忘,用起来又怕用错了。
没关系,我们可以写一个通用的查询函数,然后套用就可以。
-- 把IIF()用宏定义定义起来
#define IIF(aCondition, aTrueResult, aFalseResult) ( (aCondition) ? (aTrueResult) : (aFalseResult) )
/*
注意:
1、必须把要查询的表名放在参数表中,要查询的字段名必须放在 SELECT 语句里,跟在COALESCE() 函数后面
2、系统函数和字段名都区分大小写,尽量全部大写
3、每个查询条件必须以AND或OR开头
*/
DECLARE
IN_TABLE_NAME VARCHAR(64) DEFAULT "";-- 表名
OUT_STR_COL_NAME VARCHAR(1024) DEFAULT "";-- 字段名
OUT_STR_WHERE_COL_NAME VARCHAR(1024) DEFAULT "";-- 条件字段名
/*定义查询结果列名以逗号隔开的格式*/
SET OUT_STR_COL_NAME = "ENAME,DNAME,HOME,BASIC";
/*定义查询条件字段名以逗号隔开的格式,必须以AND或OR开头。以AND开头查询结果会发生变化*/