【问题标题】:Mysql select query with multiple dynamic conditions具有多个动态条件的Mysql选择查询
【发布时间】:2018-12-26 04:34:20
【问题描述】:

假设我有桌子:

** 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 type] [-n number] [-s size] [-l location] (所有参数都是可选的。)

如果给出-t,那么它将运行“select * from table where Type= args.type”;

如果给出-n,那么它将运行“select * from table where Number= args.number”;

如果同时给出 -t 和 -n,那么它将运行“select * from table where Type= args.type 和 Number = args.number";

...

如果所有参数都给出,那么它将运行“select * from table where Type= args.type and Number = args.number and ... and ..”;

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

【问题讨论】:

  • 请编辑您的问题,以便其他人更容易阅读。

标签: python mysql


【解决方案1】:

我不知道你是否使用了 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上查看工作演示

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-01-06
    • 2013-10-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-21
    相关资源
    最近更新 更多