有选择地过滤列值不为空的行 PostgreSQL
Selectively filter rows where column value is not null PostgreSQL
我在 Postgres 11.0 中关注 table。
col1 col2 col3 col4 col5
1 NCT02582996 acetaminophen+caffeine+dihydroergotamine+metoclopramide. metoclopramide. 204756
1 NCT02582996 acetaminophen+caffeine+dihydroergotamine+metoclopramide. metoclopramide. null
3 NCT02582997 acetaminophen metoclopramide. 204758
4 NCT02582998 ibuprufin ibuprufin null
对于相同的 col1 值,我只想保留 col5 不为空的那些行。并丢弃另一行。
期望的输出是:
col1 col2 col3 col4 col5
1 NCT02582996 acetaminophen+caffeine+dihydroergotamine+metoclopramide. metoclopramide. 204756
3 NCT02582997 acetaminophen metoclopramide. 204758
4 NCT02582998 ibuprufin ibuprufin null
select * from tbl where col5 is not null --excluding row 4
我不确定如何才能做到这一点。非常感谢任何帮助。
我想你可以使用 distinct on
:
select distinct on (col1) t.*
from tbl t
order by col1, col5
这仅在 col1
中为每个不同的值生成一行。如果 col1
在 col5
中同时具有非 null
和 null
值,则保留非 null
值。如果只有一行可用,具有 null
值,则选择它。
CREATE TABLE tbl
( col1 integer
, col2 text
, col3 text
, col4 text
, col5 integer
);
INSERT INTO tbl
VALUES
(1, 'NCT02582996', 'acetaminophen+caffeine+dihydroergotamine+metoclopramide.', 'metoclopramide.', 204756)
,(1, 'NCT02582996','acetaminophen+caffeine+dihydroergotamine+metoclopramide.', 'metoclopramide.',NULL)
,(3, 'NCT02582997','acetaminophen', 'metoclopramide.', 204758)
,(4, 'NCT02582998','ibuprufin',NULL,NULL)
;
select * from tbl t1;
select * from tbl t1
where col5 is not null
OR NOT EXISTS (
select * from tbl x
WHERE x.col1 = t1.col1
and x.col5 is not null
);
结果:
CREATE TABLE
INSERT 0 4
col1 | col2 | col3 | col4 | col5
------+-------------+----------------------------------------------------------+-----------------+--------
1 | NCT02582996 | acetaminophen+caffeine+dihydroergotamine+metoclopramide. | metoclopramide. | 204756
1 | NCT02582996 | acetaminophen+caffeine+dihydroergotamine+metoclopramide. | metoclopramide. |
3 | NCT02582997 | acetaminophen | metoclopramide. | 204758
4 | NCT02582998 | ibuprufin | |
(4 rows)
col1 | col2 | col3 | col4 | col5
------+-------------+----------------------------------------------------------+-----------------+--------
1 | NCT02582996 | acetaminophen+caffeine+dihydroergotamine+metoclopramide. | metoclopramide. | 204756
3 | NCT02582997 | acetaminophen | metoclopramide. | 204758
4 | NCT02582998 | ibuprufin | |
(3 rows)
我在 Postgres 11.0 中关注 table。
col1 col2 col3 col4 col5
1 NCT02582996 acetaminophen+caffeine+dihydroergotamine+metoclopramide. metoclopramide. 204756
1 NCT02582996 acetaminophen+caffeine+dihydroergotamine+metoclopramide. metoclopramide. null
3 NCT02582997 acetaminophen metoclopramide. 204758
4 NCT02582998 ibuprufin ibuprufin null
对于相同的 col1 值,我只想保留 col5 不为空的那些行。并丢弃另一行。
期望的输出是:
col1 col2 col3 col4 col5
1 NCT02582996 acetaminophen+caffeine+dihydroergotamine+metoclopramide. metoclopramide. 204756
3 NCT02582997 acetaminophen metoclopramide. 204758
4 NCT02582998 ibuprufin ibuprufin null
select * from tbl where col5 is not null --excluding row 4
我不确定如何才能做到这一点。非常感谢任何帮助。
我想你可以使用 distinct on
:
select distinct on (col1) t.*
from tbl t
order by col1, col5
这仅在 col1
中为每个不同的值生成一行。如果 col1
在 col5
中同时具有非 null
和 null
值,则保留非 null
值。如果只有一行可用,具有 null
值,则选择它。
CREATE TABLE tbl
( col1 integer
, col2 text
, col3 text
, col4 text
, col5 integer
);
INSERT INTO tbl
VALUES
(1, 'NCT02582996', 'acetaminophen+caffeine+dihydroergotamine+metoclopramide.', 'metoclopramide.', 204756)
,(1, 'NCT02582996','acetaminophen+caffeine+dihydroergotamine+metoclopramide.', 'metoclopramide.',NULL)
,(3, 'NCT02582997','acetaminophen', 'metoclopramide.', 204758)
,(4, 'NCT02582998','ibuprufin',NULL,NULL)
;
select * from tbl t1;
select * from tbl t1
where col5 is not null
OR NOT EXISTS (
select * from tbl x
WHERE x.col1 = t1.col1
and x.col5 is not null
);
结果:
CREATE TABLE
INSERT 0 4
col1 | col2 | col3 | col4 | col5
------+-------------+----------------------------------------------------------+-----------------+--------
1 | NCT02582996 | acetaminophen+caffeine+dihydroergotamine+metoclopramide. | metoclopramide. | 204756
1 | NCT02582996 | acetaminophen+caffeine+dihydroergotamine+metoclopramide. | metoclopramide. |
3 | NCT02582997 | acetaminophen | metoclopramide. | 204758
4 | NCT02582998 | ibuprufin | |
(4 rows)
col1 | col2 | col3 | col4 | col5
------+-------------+----------------------------------------------------------+-----------------+--------
1 | NCT02582996 | acetaminophen+caffeine+dihydroergotamine+metoclopramide. | metoclopramide. | 204756
3 | NCT02582997 | acetaminophen | metoclopramide. | 204758
4 | NCT02582998 | ibuprufin | |
(3 rows)