2013-05-30 27 views
0

我正在做一個報告,我不能以編程方式構建SQL。我有兩個值被輸入到報告中。可以是以下三個選項之一的值:有條件的地方在基於值的SQL中?

  1. 贖回
  2. 購買
  3. 贖回和購買

查詢需要有一個WHERE子句。如果「贖回」被送入,它必須有:

... WHERE balance < 0 

如果「購買」被送入,它必須有:

... WHERE balance >= 0 

如果兩者都饋入,這種情況可以被排除在外完全,或者也可以說:

... WHERE balance >= 0 OR balance < 0 --> but this is redundant 

是否有適用這種邏輯在SQL的方式?在SQL中是這樣可能的:

SELECT * FROM account WHERE (if param1 = 'redeem' then 'balance <= 0) ... etc 

+0

使用'case'在'where',這可能是有用的:http://stackoverflow.com/questions/6812276/how-to-use-case-in-where-clause –

回答

3

沒錯。你快到了。

WHERE (param='redeem' and balance <=0) or (param='purchase' and balance>=0) or (param='redeem AND purchase ') 
+0

+1這是我相信的唯一正確答案 - 在這裏你去(http://sqlfiddle.com/#!2/865d1/1)(儘管你可能會刪除最後一個檢查) – sgeddes

+0

只是noe說param ='贖回併購買'部分不正確。我用:param1 =「贖回」和param2 =「購買」等 – coderama

0

這會做詭計嗎?

WHERE 
    (purchase is not null && balance >= 0) 
OR 
    (redeem is not null && balance < 0) 
1

在您的WHERE子句中使用CASE陳述。你可以找到例子here

我嘗試下面的代碼在MySQL和它的工作原理:

SET @param = 'purchase'; 

SELECT * FROM TEST.ACCOUNT 
WHERE CASE 
    WHEN @param = 'redeem' THEN BALANCE < 0 
    WHEN @param = 'purchase' THEN BALANCE >= 0 
    ELSE TRUE 
END; 
+1

+ 1如果你能舉一個例子,那會很好。 :) –

+0

我添加了一個鏈接... – eternay

+0

-1你需要在這裏發佈相關的代碼,以防鏈接死機。 – Kermit

0
CASE WHEN param1 = 'redeem' THEN balance <= 0 
+0

爲什麼有一個報價之前平衡? –

+1

@Vivek謝謝我更新了答案 – PSR