2016-06-20 40 views
1

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

+0

我不清楚你想达到什么目的。如果你想为每一行使用不同数量的列,那么没有这是不可能的。请[编辑]你的问题,并根据这些数据添加一些样本数据和预期的输出。 (请格式化文本,[无截图](http://meta.stackoverflow.com/questions/285551/why-may-i-not-upload-images-of-code-on-so-when-asking-a-问题/ 285557#285557)) –

+0

我改变了措辞,希望现在更清楚。我不认为这里的样本数据会很有用,因为数据内容不相关。 – cis

+0

你为什么不简单地创建两个视图?一个是所有列,一个是只有你需要的列? –

回答

1

与其他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 $$; 
+1

SQL Server还要求_functions_的结果是“明确定义的”。您可能指的是存储的_procedures_,它可以在SQL服务器中返回任意结果(您也可以在Postgres中使用refcursors进行操作) –

+0

谢谢。无论如何,函数返回jsonb,所以这不是问题。但是,我在SELECT里面放置条件? – cis

+0

@cis我更新了回复。请注意,'concat_ws'将会忽略任何NULL参数,所以它对于这类事情来说是完美的。 –