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

时间:2018-12-26 04:34:20

标签: python mysql

假设我有桌子:

** 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 and Number = args.number“;

...

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

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

1 个答案:

答案 0 :(得分:0)

我不知道您是否正在使用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上查看有效的演示