Postgresql

基於布爾變數在 WHERE 子句中拆分案例

  • June 11, 2019

我必鬚WHERE根據布爾變數拆分子句:

如果ShowZeroVariabletrue,我只在某個整數列中顯示行值 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;

引用自:https://dba.stackexchange.com/questions/240215