2017-01-28 14 views
0

我有表[R whice包含,理解空值功能

b | c 
------------------- 
1  | null  
------------------- 
2  | null  
------------------- 
3  | 4  
------------------- 
3  | 5  

而且我將它這個查詢:

SELECT count(*), count(c), min(c), sum(c) 
FROM (SELECT c 
     FROM R 
     WHERE c IS NULL or c <> NULL 
     GROUP BY c) 

爲什麼輸出將1,0,null,null而不是3,2,4,9

是不是內部查詢應該返回null,4,5作爲c行?

我知道count(*)計數所有行,count(c)將避免空值。 還有min()sum()避免空值。

爲什麼這是結果?

+0

這是什麼'其中C是NULL或c <> NULL'? – McNets

+0

我認爲這應該會給每一行,因爲任何值是空的!= null – limitless

+0

這個查詢沒有意義,我只是想了解爲什麼返回值是1,0,null,null – limitless

回答

1

如果你運行這個:

with R( b , c) as (
    select 1  , null::int union all 
    select 2  , null::int union all 
    select 3  , 4 union all 
    select 3  , 5 
) 
SELECT c 
     FROM R 
     WHERE c IS NULL or c <> NULL; 

它會給你:

null 
null 

爲什麼呢?因爲c<>null始終爲空因此,將不會提取非空值。你想用c is not null來檢查col是否不爲空。儘管如此,無論如何,這並沒有什麼意義。

進一步,基團通過其上:

SELECT c 
    FROM R 
    WHERE c IS NULL or c <> NULL 
    GROUP BY c; 

產生單個零點

null 

然後在其上最終聚集體將產生:

SELECT count(*), count(c), min(c), sum(c) 
FROM (SELECT c 
    FROM R 
    WHERE c IS NULL or c <> NULL 
    GROUP BY c) t 

1,0,null,null 

使用此:

with R( b , c) as (
    select 1  , null::int union all 
    select 2  , null::int union all 
    select 3  , 4 union all 
    select 3  , 5 
) 
SELECT count(*), count(c), min(c), sum(c) 
FROM (SELECT c 
     FROM R 
     GROUP BY c) t 

生產:

count count min sum 
3  2  4 9 

DEMO for you

0

如果你執行你的子查詢:

SELECT c 
     FROM R 
     WHERE c IS NULL or c <> NULL 
     GROUP BY c; 

它返回NULL

然後:

SELECT COUNT(*) FROM NULL; 

Returs一樣SELECT COUNT(*) = 1

SELECT COUNT(C) 

返回相同SELECT COUNT(NULL) = 0

而且

MIN(NULL), SUM(NULL) = NULL 

如果重新定義您的查詢,如:

SELECT COUNT(*), COUNT(C), MIN(C), SUM(C) 
FROM 
    (SELECT c 
    FROM R 
    WHERE c IS NULL or c IS NOT NULL 
    GROUP BY c) A; 

結果是:

count | count | min | sum 
    3  2  3  7 

由於子查詢返回:

C 
---- 
NULL 
4 
3 
+0

謝謝,請問爲什麼內部查詢返回null? 是不是每行都可以在c中爲null或者!= null? – limitless