繁体   English   中英

MySQL选择查询具有多个动态条件

[英]Mysql select query with multiple dynamic conditions

假设我有桌子:

** Table**
---------------------------------------
ID  Type    Number  Size    Location
---------------------------------------
1   Apple   5       M        A
2   Apple   4       S        B
3   Banana  5       M        B
4   Apple   7       S        A
5   Pear    5       L        C
6   Pear    5       M        A
7   Apple   3       L        A
8   Pear    2       M        A
9   Banana  4       M        B

我的程序是select.py [-t类型] [-n编号] [-s大小] [-l位置](所有参数都是可选的。)

如果给定了-t,它将运行“在Type = args.type的表中选择*”。

如果给定-n,它将运行“从Number = args.number的表中选择*”;

如果同时给出了-t和-n,则它将运行“从Type = args.type和Number = args.number的表中选择*”;

...

如果给定了所有参数,则它将运行“从Type = args.type和Number = args.number以及...和..的表中选择*”。

如何编写通用的where子句以涵盖所有以上可能的情况?

我不知道您是否使用ORM,但是可以使用如下所示的逻辑构造本机MySQL查询。 这个想法是每个IFNULL的第一个参数(即NULL值)将成为程序中查询的变量。 这样,如果该值为null,则我们将turple的该列中的数据与其自身进行比较,以便条件返回true。

-- IF AT LEAST ONE PARAMETER PASSED
SELECT A.*
FROM TEST A
WHERE 
        A.ID=IFNULL(NULL,A.ID) 
    AND A.TYPE=IFNULL('Pear',A.TYPE)
    AND A.NUMBER=IFNULL(NULL,A.NUMBER)
    AND A.SIZE=IFNULL('L',A.SIZE)
    AND A.LOCATION=IFNULL(NULL,A.LOCATION);

-- NO PARAMETER PASSED
SELECT A.*
FROM TEST A
WHERE 
        A.ID=IFNULL(NULL,A.ID) 
    AND A.TYPE=IFNULL(NULL,A.TYPE)
    AND A.NUMBER=IFNULL(NULL,A.NUMBER)
    AND A.SIZE=IFNULL(NULL,A.SIZE)
    AND A.LOCATION=IFNULL(NULL,A.LOCATION);

查看有关SQL Fiddle的有效演示

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM