我想獲取一條包含布爾標誌的記錄:如果特定結果集中的列至少有一個NOT NULL值,則爲true,如果所有值都爲NULL,則爲false。優化NULL/NOT NULL標誌PostgreSQL查詢
結果的樣本數據集
SELECT "my column 1", "my column 2", "my column 3", "my column 4", "my column 5"
FROM my_data
WHERE date BETWEEN :start AND :end
"my column 1" "my column 2" "my column 3" "my column 4" "my column 5"
NULL NULL 25.2 NULL 1.12
15.28 NULL NULL NULL 2.25
NULL NULL 13.9 NULL 3.03
359.00 NULL 125.5 NULL 4.15
NULL NULL 152.2 NULL 5.99
NULL NULL NULL NULL 6.35
在這種情況下的結果應該是:
"my column 1" "my column 2" "my column 3" "my column 4" "my column 5"
t f t f t
阿繼PostgreSQL的查詢不正是我需要的(實際上它儘快終止每個子查詢作爲第一NOT NULL值已被檢測到),但可以優化嗎?:
WITH x AS (SELECT * FROM my_data WHERE date BETWEEN :start AND :end)
SELECT
EXISTS(SELECT * FROM x WHERE "my column 1" IS NOT NULL) AS "my column 1",
EXISTS(SELECT * FROM x WHERE "my column 2" IS NOT NULL) AS "my column 2",
EXISTS(SELECT * FROM x WHERE "my column 3" IS NOT NULL) AS "my column 3",
EXISTS(SELECT * FROM x WHERE "my column 4" IS NOT NULL) AS "my column 4",
EXISTS(SELECT * FROM x WHERE "my column 5" IS NOT NULL) AS "my column 5"
我認爲它可以寫得更短或者更普遍,而不用提到每個列名。
它是否表現出色? –
你可以使用CASE? https://www.postgresql.org/docs/9.4/static/functions-conditional.html – lionbtt
@Ranadip Dutta:不,但我認爲它可以寫得更短或全部,而不必提及每個列的名稱。 – Paul