返回

无需公式多条件查询,工作轻松无需加班

Excel技巧

很多人一看到“多条件查询”四个字,脑子第一个想到的一定是公式。背过公式的都知道,查询公式里好像跟“多条件”沾边儿的字儿就只有两个: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开头查询结果会发生变化*/