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