簡體   English   中英

MySQL選擇查詢具有多個動態條件

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM