select_list中的条件:只取某些列
在函数内我在SELECT
表达式中有很长的列列表。select_list中的条件:只取某些列
该函数在前端的各个点被调用。但是,有两种情况:在一种情况下,我想让该函数在其SELECT列表中列出的所有列。在另一个我只想要有一半。要获取的列取决于在前端设置的功能参数withAdditionalStuff
。
当然,在这两种情况下,列所有行相同:
-
withAdditionalStuff = false
意味着:返回columnA,columnB,columnC ......所有行 -
withAdditionalStuff = true
意味着它应该返回columnA,所有行的列B,列C,列D,列E,列F ...。
所以,我需要的是这样的:
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。
与其他RDBMS如MS-SQLServer不同,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 Server还要求_functions_的结果是“明确定义的”。您可能指的是存储的_procedures_,它可以在SQL服务器中返回任意结果(您也可以在Postgres中使用refcursors进行操作) –
谢谢。无论如何,函数返回jsonb,所以这不是问题。但是,我在SELECT里面放置条件? – cis
@cis我更新了回复。请注意,'concat_ws'将会忽略任何NULL参数,所以它对于这类事情来说是完美的。 –
我不清楚你想达到什么目的。如果你想为每一行使用不同数量的列,那么没有这是不可能的。请[编辑]你的问题,并根据这些数据添加一些样本数据和预期的输出。 (请格式化文本,[无截图](http://meta.stackoverflow.com/questions/285551/why-may-i-not-upload-images-of-code-on-so-when-asking-a-问题/ 285557#285557)) –
我改变了措辞,希望现在更清楚。我不认为这里的样本数据会很有用,因为数据内容不相关。 – cis
你为什么不简单地创建两个视图?一个是所有列,一个是只有你需要的列? –