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