Postgresql
基於布爾變數在 WHERE 子句中拆分案例
我必鬚
WHERE
根據布爾變數拆分子句:如果
ShowZeroVariable
是true
,我只在某個整數列中顯示行值 0。如果
false
我想顯示所有大於 0 的值。像這樣的東西:
select IntField from Table where IntField case when ShowZeroVariable = 'true' then = '0' else <= '0' end
我只能通過轉換為文本來使其工作 (但這不會在錯誤時過濾掉零值):
select IntField from Table where IntField::text like case when ShowZeroVariable = 'true' then '0' else '%' end
似乎無法讓
WHERE
子句CASE
語句與運算符<
/=
/一起使用>
。
CASE
可能不是這裡的正確工具。但是您可以使用布爾表達式。... WHERE showzerovariable AND intfield = 0 OR NOT showzerovariable AND intfield > 0 ...
CASE
也不錯:... WHERE CASE showzerovariable WHEN true THEN int_column = 0 WHEN false THEN int_column > 0 END
如果定義了變數,則更簡單
NOT NULL
:... WHERE CASE WHEN showzerovariable THEN int_column = 0 ELSE int_column > 0 END
但是,如果您的查詢可以從索引中受益,那麼這不適用於準備好的語句(
showzerovariable
作為變數輸入)。(如果超過百分之幾的所有行滿足每個條件,則索引是無用的。)並且 PL/pgSQL 喜歡將查詢視為準備好的語句 - 如果滿足某些先決條件。看:如果索引對至少一個子案例有用並且您確實在使用 PL/pgSQL,請考慮拆分案例以優化性能。像:
IF showzerovariable THEN RETURN QUERY SELECT ... WHERE int_column = 0; ELSE RETURN QUERY SELECT ... WHERE int_column > 0; END IF;