在函数中,我在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。

最佳答案

与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 $$;

关于sql - select_list中的条件:仅包含一些列,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/37915725/

10-13 02:13