2016-06-20 41 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參數,所以它對於這類事情來說是完美的。 –