在函数内部,我在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。
答案 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 $$;