2012-06-13 41 views
1

我有一個參數化的postgresql查詢,用戶通過PHP前端進行交互。其中一個參數涉及布爾值,我想給用戶「真」,「假」,「未知」(空)或「無關緊要」(返回任何結果)的選項。postgresql中的布爾型通配符

重寫實際查詢不是一個選項(參數化查詢存儲在數據庫表中,而不是PHP代碼中),所以我需要一個布爾值「any」值。

換言之,無論「boolean_column」的值如何,我可以在此查詢中分配「:parameter1」以獲得任何行的值?

SELECT some_column, some_other_column 
FROM some_table 
WHERE boolean_column = :parameter1 

編輯:我需要澄清 - 可以重寫查詢,但程序不能重寫查詢(即,我無法刪除或重寫其中響應於用戶輸入條款在運行時)。

EDIT2:(!感謝壽齡)這是我的最終解決方案

SELECT some_column, some_other_column 
FROM some_table 
WHERE (:parameter1::text = 'any' OR boolean_column = :parameter1::boolean) 

當然,該方案具有限制可能的值可以強制轉換「任意」或一個字符串值,以布爾值(例如「真','T','假','F')。

EDIT3:以前的解決方案可以在PDO中使用PHP,但由於某些原因,不能在python的psycopg2或直接在postgresql中使用。我已經嘗試了一個變體,如下所示:

SELECT some_column, some_other_column 
FROM some_table 
WHERE (CASE WHEN :parameter1::text in ('true', 'false') THEN boolean_column = :parameter1::boolean ELSE TRUE END) 

但是這也行不通。看起來無論如何,我無法阻止postgresql試圖評估「:parameter1 :: boolean」,即使它在一個錯誤的WHEN條件後面。這是一個真正的醃菜...

+0

Ummmm ....你不知道。這就是'where'的條件。除非你進行一點注入(即't或1 = 1'),否則你必須在你的數據庫表中添加一個新的查詢,然後檢索那個查詢。 – 2012-06-13 15:50:12

回答

2

那麼你的查詢必須改變。布爾值有兩個值truefalse,而空值永遠不會等於任何值(即使null不等於null)。

你當然可以使用:

SELECT some_column, some_other_column 
FROM some_table 
WHERE (boolean_column = :parameter1 OR :parameter1 is null) 
+0

我認爲這可能會起作用,或者至少讓我朝着正確的方向前進。 –

+0

關閉我的頭頂我不記得你是否可以使用相同的參數兩次(沒有我的開發機器手)。如果沒有,您可能需要將其設置爲param1,param2。 –

+0

它使用了兩次,但每次都必須對它們進行註釋以確保比較正常。 –