我有一個參數化的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條件後面。這是一個真正的醃菜...
Ummmm ....你不知道。這就是'where'的條件。除非你進行一點注入(即't或1 = 1'),否則你必須在你的數據庫表中添加一個新的查詢,然後檢索那個查詢。 – 2012-06-13 15:50:12