鑒于這個簡單的桌子小提琴
CREATE TABLE tbl (
tbl_id serial PRIMARY KEY,
column_a text NOT NULL,
isactive bool NOT NULL
);
INSERT INTO tbl VALUES
(1, 'a', true)
, (2, 'b', true)
, (3, 'c', false);
我看到一個用戶使用這個 case 陳述句來抑制引數
SELECT
tbl_id,
column_a,
isactive
FROM tbl
WHERE CASE WHEN $1 IS NOT NULL THEN isactive = $1 ELSE 1=1 end AND
CASE WHEN $2 IS NOT NULL THEN column_a = $2 ELSE 1=1 end
我將建議他們使用這種語法
SELECT
tbl_id,
column_a,
isactive
FROM tbl
WHERE ($1 IS NULL OR isactive = $1) and
($2 IS NULL OR column_a = $2)
我認為這些是等效的(并且可能更容易閱讀)。你會做一些不同的事情嗎?
uj5u.com熱心網友回復:
你的建議肯定比CASE宣告更好,效率也不低。
但是OR在WHERE條件下通常是一個問題,因為這使得 PostgreSQL 很難使用索引來加速查詢。
更好的解決方案是:
WHERE僅當引數出現時才將條件添加到查詢中IS NOT NULL將查詢寫為
UNION:SELECT tbl_id, column_a, isactive FROM tbl WHERE isactive = $1 AND column_a = $2 UNION ALL SELECT tbl_id, column_a, isactive FROM tbl WHERE isactive = $1 AND $2 IS NULL UNION ALL SELECT tbl_id, column_a, isactive FROM tbl WHERE $1 IS NULL AND column_a = $2 UNION ALL SELECT tbl_id, column_a, isactive FROM tbl WHERE $1 IS NULL AND $2 IS NULL;這看起來更長更復雜,但它可以在
isactive和上使用索引column_a。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/346947.html
標籤:PostgreSQL 空值
