2010-03-03 4 views
7

저는 postgresql을 처음 사용했습니다.SELECT 문 POSTGRESE의 동적 열

이것을 달성하는 가장 좋은 방법은 무엇입니까?

SELECT get_columns() 
    FROM table_name; 

get_columns()은 쿼리의 열 이름을 제공합니다. 사람들이 EXECUTE 문을 사용하는 것을 보았지만 제대로 작동하지 않습니다.

이 열 A, B, C 테이블 시험이고 열 이름이 동적으로 생성과 내가

SELECT a,b FROM Test; 
SELECT a,c FROM Test; 

을 실행하고 싶은 말은 수 있습니다.

SELECT 
    column_name 
FROM 
    information_schema.columns 
WHERE 
    table_name = 'test'; 
+0

무엇이 요점입니까? 열 이름을 모르는 경우 검색어에 *를 사용하십시오. 어쩌면 내가 뭔가를 놓친거야? –

+0

그가 말하는 것은'get_columns()'는'a'와'c' 열 또는'a'와'b' 열 중 하나를 반환합니다. 그는 모든 컬럼을 원하지 않고, 절차 적으로 생성 한 컬럼을 원합니다. – cmptrgeekken

+0

아이디어는 get_columns()가 약간의 인수를 취할 것이고 따라서 은 어딘가에서 사용될 적절한 열을 반환합니다. 이 부분은 COPY FROM 명령을 처리 할 때 유용합니다. 여기서 내가 선택하는 CSV 파일을 기반으로 열 이름을 제공해야합니다. – Sujit

답변

-2

이입니다.

+1

예. 나는 이것을 안다. 질문은 동적으로 SELECT 문을 구성 할 수 있습니까? – Sujit

0

알려진 대형 테이블에 COPY FROM을 사용하고 있으므로 SETOF bigtable을 반환하고 특정 유형의 모든 열을 선택하는 FUNCTION을 작성하므로 해당 특정 경우에 필요하지 않은 필드에 NULL AS fieldname을 사용하십시오. 같은 :

# \d SMALL 
    Table "public.small" 
Column | Type | Modifiers 
--------+---------+----------- 
a  | integer | 
b  | integer | 
c  | integer | 
d  | integer | 

# \d LARGE 
    Table "public.large" 
Column | Type | Modifiers 
--------+---------+----------- 
a  | integer | 
b  | integer | 
c  | integer | 
d  | integer | 

# CREATE OR REPLACE FUNCTION myData() 
RETURNS SETOF large LANGUAGE SQL AS $$ 
SELECT a, 
     CASE WHEN a = 1 
      THEN b 
     ELSE 
      NULL 
END as b, 
     CASE WHEN a = 2 
      THEN c 
     ELSE 
      NULL 
END AS c, 
d 
FROM small; 
$$; 

# SELECT * FROM mydata(); 
# COPY (SELECT * FROM myData()) TO STDOUT; 

는 물론 SQL을 사용하는 가장 좋은 언어, 그래서 PL/pgSQL의 또는 PL/펄 (또는 무엇이든) 적절할 수있다하지 않을 수 있습니다.

+0

이것이 잘못된 길일 것 같습니다.이 대답을 무시해도 무방합니다. – MkV

0

함수를 사용하여 열 목록을 생성 할 수 없습니다. 그리고 난 정말 당신과 같이 8.4와 함께 할 수 있습니다, 이것은 즉 말했다 문제에 접근하는 가장 좋은 방법입니다 ... 생각하지 않는다 :

CREATE OR REPLACE FUNCTION dyn(p_name VARCHAR) 
RETURNS SETOF RECORD AS 
$$ 
    DECLARE 
    p_sql TEXT; 
    BEGIN 
    SELECT 'SELECT ' || 
    CASE p_name WHEN 'foo' THEN ' col1, col2, col3, col4 ' 
     WHEN 'bar' THEN 'col3, col4, col5, col6' 
     WHEN 'baz' THEN 'col1, col3, col4, col6' END || 
    ' FROM mytest' 
    INTO p_sql; 
    RETURN QUERY EXECUTE p_sql; 
    END 
$$ LANGUAGE 'plpgsql';

사용법은 다음과 같습니다 FROM SELECT *를 dyn ('foo') AS (하나의 int, 2 int, 3 int, 4 int)

솔직히 각 장치에 대한 뷰를 만드는 것이 좋습니다. 이 http://developer.postgresql.org/pgdocs/postgres/plpgsql-statements.html

+0

'SELECT 'SELECT'가 아니라 'EXECUTE'SELECT '를 의미합니까? –

+0

@ChrisTravers : 그 줄은 스크립트를'p_sql'으로 연결합니다. 더 이상 실행되지 않습니다. –

+0

아, 알겠습니다. RETURN QUERY EXECUTE 'SELECT ...'를 수행하지 않는 이유는 무엇입니까? –

3

동적 쿼리를 작성하기 위해 당신은 같이해야 할 것이다 PostgreSQL이 이해할 수있는 방법. 즉, 기본적으로 refcursor를 반환하거나 일관된 데이터 형식을 반환 할 수 있습니다. 나는 프로그래밍의 관점에서 시스템을 좀 더 일관성있게 만들었고, 당신이 취할 수있는 몇 가지 고급 지침이 있기 때문에 후자를 선호하지만, 나는 다른 방법을 볼 수있다.

0

내가 당신의 가장 큰 문제는 당신이 행을 반환해야한다고 생각 :

EXECUTE 'SELECT '|| get_columns()|| ' FROM table_name' INTO results 

설명서를 읽어 보시기 바랍니다 :