【问题标题】:how to return list type with filter in postgresql?如何在 postgresql 中使用过滤器返回列表类型?
【发布时间】:2021-08-24 06:24:31
【问题描述】:

我希望我的查询会在每列给出 YES 时给我类型列表。

表格如下:

a      b     c     d     no
yes   null  yes   null   1
null  yes   yes   null   2
yes   null  null  yess   3

查询的期望结果:

no   type
1     a
1     c
2     b
2     c
3     a
3     d

我应该如何编写查询以获得预期结果?

提前致谢。

【问题讨论】:

    标签: sql postgresql filter case-when


    【解决方案1】:

    查看pivot tables 或联合多个查询:

    SELECT no,'a' AS type FROM t WHERE a IS NOT NULL
    UNION SELECT no,'b' FROM t WHERE b IS NOT NULL
    UNION SELECT no,'c' FROM t WHERE c IS NOT NULL
    UNION SELECT no,'d' FROM t WHERE d IS NOT NULL
    ORDER BY no,type
    

    编辑(见 cmets):

    SELECT no,'a' AS type FROM t WHERE a = 'yes'
    UNION SELECT no,'b' FROM t WHERE b = 'yes'
    UNION SELECT no,'c' FROM t WHERE c = 'yes'
    UNION SELECT no,'d' FROM t WHERE d = 'yes'
    ORDER BY no,type;
    

    演示:db<>fiddle

    【讨论】:

    • 可能WHERE a = 'yes' 等会更好。如果 a 的值为“否”,我怀疑 OP 是否想要结果。我们不知道唯一可能的值是“是”和空值(尽管这些是样本数据中唯一的值)。
    • @JonathanWillcock 我也这么认为,但是在 OP 中有 yesyess(带有双 s),所以我决定安全并抓住空值 :-D 谢谢提示
    • 谢谢!它实际上应该是yes not yess。有什么办法可以缩短查询?
    • @nomnom3214 当然有更短的方法来解决这个问题,但要复杂得多(看看数据透视表/交叉表)。对于这样一个简单的用例,我根本不会打扰其他交叉表,当然要考虑性能和您拥有的列数;)
    【解决方案2】:

    作为替代方案,您可以使用 unnest:

    WITH cte as
    (SELECT no, 
    unnest(array['a', 'b', 'c', 'd']) as type,
    unnest(array[a, b, c, d]) as colvalue
    from abcdtypes)
    SELECT no, type 
    FROM cte 
    where colvalue = 'yes'
    ORDER BY 1, 2;
    

    它可以工作并且可以说更优雅。但如果有很多列,我只会做这样的事情。对于您示例中的四个,我也将支持 Jim Jones。

    【讨论】:

      猜你喜欢
      • 2023-01-25
      • 1970-01-01
      • 2017-08-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-06-24
      • 1970-01-01
      • 2020-07-14
      相关资源
      最近更新 更多