select_list中的条件:仅占用一些列

时间:2016-06-20 06:20:28

标签: sql postgresql

在函数内部,我在SELECT表达式中有很长的列列表。

此功能在前端的各个点调用。但是,有两种情况:在一种情况下,我希望在SELECT列表中包含该函数列表的所有列。在另一个我只希望有一半。要获取的列由前端设置的函数参数withAdditionalStuff确定。

当然,在这两种情况下,所有行的列都是相同的:

  • withAdditionalStuff = false表示:返回所有行的columnA,columnB,columnC ...
  • withAdditionalStuff = true表示它应该返回所有行的columnA,columnB,columnC,columnD,columnE,columnF ....

所以,我需要的是这样的东西:

SELECT many_columns_here ..... IF `withAdditionalStuff` = TRUE
THEN many_many_other_columns_here... END IF; FROM....

但这不起作用。

但是,如果我在CASE 'withAdditionalStuff' = TRUE THEN some_column END AS some_column内包装每一列,当然不是完全省略该列,PostgreSQL总是返回列some_column。因此,当我将函数设置withAdditionalStuff调用为false时,我会得到很多空列。除此之外,在CASE WHEN内包含数十个列标题非常烦人。

有没有办法让SELECT列表中的条件表达式确定要获取哪些列以及哪些列完全省略?

该函数将其结果返回为jsonb。

我正在使用PostgreSQL 9.4.4。

1 个答案:

答案 0 :(得分:1)

与MS-SQLServer等其他RDBMS不同,PostgreSQL要求定义函数的结果,因此不能省略结果中的列。

解决此问题的一种方法是返回JSON对象而不是正常记录集。这样,您可以使用所需的特定列动态构造查询,并返回:

RETURN QUERY EXECUTE 
  $$ SELECT to_jsonb(x) FROM (
    SELECT $$||concat_ws(',',
      CASE WHEN withAdditionalStuff THEN $$ AdditionalStuff $$ END,
      CASE WHEN withExtraStuff      THEN $$ ExtraStuff $$ END,
      ...
      )||$$
    FROM ...
    WHERE ...
    ) x $$;