Postgresql

如何在空的不同行上選擇同一個表中的數據?

  • April 10, 2015

我在我的 SQLite 數據庫上使用這個選擇:

SELECT attributeX
FROM table
GROUP BY attributeX
HAVING COUNT(attributeY) = 0;

我的桌子:

 attributeX (type integer) |  attributeY (type text)
----------------+-------
 1452 | aaa            
 1452 | bbb
 1452 | 
 1452 | bbb
 1453 |
 1453 |   
 1453 |
 1454 | eee
 1454 | fff
 1455 | iii
     .... 

1453只有當列中的所有項目attributeY都為空時,我才會得到結果1453。所以在 SQLite 我得到了 result 1453

我只有myschema在 PostgreSQL 中才有相同的數據庫。我用這個SELECT

SELECT attributeX
FROM myschema.table
GROUP BY attributeX
HAVING COUNT(attributeY) = 0;

我得到:

attributeX
------------
(0 rows)

如何在 PostgreSQL 中選擇?

此表的 SQLite 架構:

CREATE TABLE table (
attribute1 INTEGER PRIMARY KEY,
attributeX INTEGER NOT NULL,
attribute2 TEXT NOT NULL,
attributeY TEXT
);

CREATE INDEX table_attributeY_idx ON table (attributeY);
CREATE INDEX table_attribute2_idx ON table (attribute2);
CREATE INDEX table_attributeX_idx ON table (attributeX);

此表的 PostgreSQL 架構:

Table "myschema.table"
       Column  |          Type         |                                    Modifier                             | Storage  | Desc
----------------+-----------------------+-------------------------------------------------------------------------+----------+-------
attribute1     | integer               | not null implicitly nextval('myschema.table_attribute1_seq'::regclass)  | plain    |
attributeX     | integer               | not null                                                                | plain    |
attribute2     | character varying(32) | not null                                                                | extended |
attributeY     | text                  |                                                                         | extended |
Indexy:
   "table_attribute1_pkey" PRIMARY KEY, btree (attribute1)
   "fki_table_attributeX_fkey" btree (attributeX)
Conditions for foreign key:
   "table_attributeX_fkey" FOREIGN KEY (attributeX) REFERENCES myschema.table2(attributeX2) ON UPDATE RESTRICT ON DELETE CASCADE
Has OID: no

插入:

INSERT INTO myschema.table (attributeX, attribute2, attributeY)
VALUES (%s, %s,%s)... (python script)

你解釋:

1453只有當列中的所有項目attributeY都為時,我才會得到結果1453

但這是不正確的。大膽強調我的。聚合函式count返回(根據文件):

表達式的值不為空的輸入行數

SQLite 也是如此(根據文件):

count(X) 函式返回組中X不為 NULL的次數的計數。

您的 Postgres 表中顯然有一行或多行具有非空值attributeY- 可能是一個空字元串''

測試:

SELECT *
FROM   myschema.table
WHERE  attributeX = 1453
AND    attributeY IS NOT NULL;

請務必了解“空” ( ) 和****之間的區別''``NULL

空字元串是具有 0 個字元 ( )的字元類型(通常是text,varchar或) - 所以基本上是“無”,相當於數字數據類型。對於任何數據類型都是可能的,並且意味著“未知”。一些客戶很難在他們的展示中明確區分。char``''``0``NULL

替代查詢

要查找attributeX全部attributeY**或NULL的位置,**請使用此替代查詢:

SELECT attributeX
FROM   myschema.table
GROUP  BY attributeX
HAVING NOT bool_or(attributeY <> '');

該表達式attributeY <> ''true適用於非空、非空attributeY。聚合函式bool_or返回(根據文件):

如果至少一個輸入值為真,則為真,否則為假

這些是我們排除( NOT ...) 並返回其餘的結果。瞧。

還有許多其他(不太優雅)的方法可以實現相同的目標。喜歡:

... HAVING count(CASE WHEN attributeY <> '' THEN 1 END) = 0;
... HAVING count(attributeY <> '' OR NULL) = 0;
... HAVING count(NULLIF(attributeY, '') = 0;

更多的:

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