Postgresql
如何在空的不同行上選擇同一個表中的數據?
我在我的 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 我得到了 result1453
。我只有
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;
更多的: