假设我有桌子:
** 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子句来涵盖以上所有可能的情况?
答案 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上查看有效的演示