sql—有选择地筛选列值不为null的行postgresql

9vw9lbht  于 2021-07-27  发布在  Java
关注(0)|答案(2)|浏览(621)

我在postgres11.0中有下表。

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不为null的行。丢弃另一行。
期望输出为:

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

我不知道怎样才能做到这一点。非常感谢您的帮助。

tkqqtvp1

tkqqtvp11#

我想你可以用 distinct on :

select distinct on (col1) t.*
from tbl t
order by col1, col5

这将为中的每个不同值生成一行 col1 只是。如果 col1 有两个非- null 以及 null 价值 col5 ,然后是非- null 值被保留。如果只有一行可用,则使用 null 值,则将其选中。

rlcwz9us

rlcwz9us2#

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)

相关问题