2017-09-20 26 views
1

我想要一個函數,它返回給定表名的逗號分隔列標題的文本字符串。下面的代碼編譯得很好,並且不會產生任何錯誤,但是我不能讓它返回除了NULL之外的其他任何內容。在PostgreSQL中通過函數返回列的列表

CREATE OR REPLACE FUNCTION myschema.return_column_list(tab_name TEXT) 
    RETURNS text AS 
    $BODY$ 
     DECLARE 
      one_column record; 
      column_list TEXT; 
     BEGIN 

      FOR one_column IN 
       SELECT column_name FROM information_schema.columns 
       WHERE table_schema = 'myschema' 
       AND table_name = format('%s', tab_name) 
      LOOP 
       column_list = column_list || one_column || ','; 
      END LOOP; 

      column_list = left(column_list,length(column_list) - 1); 
      RETURN column_list; 

     END; 
    $BODY$ LANGUAGE 'plpgsql'; 

更新:

終於得到它通過改變DECLARE部分從

工作
DECLARE 
    one_column record; 
    column_list TEXT; 

DECLARE 
    one_column record; 
    column_list TEXT = ''; 

按照第一個例子here。花了整整一個早上試圖找出這一個,任何人都可以解釋爲什麼我必須這樣做?

+0

'one_column'是包含單個屬性的**記錄**。要獲得實際的'column_name'值,你必須使用'one_column.column_name'。 –

+1

'column_list TEXT;'將'column_list'初始化爲'null'。將值連接到'null'值會產生'null' –

+0

@a_horse_with_no_name它是拋出我的變量初始化位!一旦你知道就會很有意義 - 將會讀到它。 – Alex

回答

1

完全不需要循環。你可以簡單地使用string_agg

SELECT STRING_AGG(column_name, ',') 
FROM information_schema.columns 
WHERE table_schema = 'public' 
AND table_name = 'testx'; 

你可以在你的代碼中使用它作爲子查詢。

Rextester Demo


或者,如果你需要一個功能:

CREATE OR REPLACE FUNCTION myschema.return_column_list(tab_name TEXT) 
RETURNS text AS 
$BODY$ 
BEGIN 
    RETURN (SELECT string_agg(column_name, ',') FROM information_schema.columns 
        WHERE table_schema = 'myschema' 
        AND table_name = format('%s', tab_name)); 
END; 
BODY$ LANGUAGE 'plpgsql'; 

Rextester Demo 2


至於變量i nitialization。默認值爲NULL,連接到column_name的NULL仍爲NULL

SELECT NULL || 'a'; 
-- NULL 
1

我不是100%肯定我明白你的問題,但是這是初始值:

DECLARE variable_name [ CONSTANT ] datatype [ NOT NULL ] [ { DEFAULT | := } initial_value ] 

您申報不爲空的情況基本沒有,如果你的函數將返回任何結果,對例如沒有記錄。對於字符串(你的案例中的文字)是「'。

如果爲null,那麼也不能添加到它,例如與新值連接!