[英]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.