select (select '컬럼') from 테이블;
table name : table
column : a, b
value : 1, 2
select (select 'a'), b from table;
결과
?column? | b
a | 2
원하는 결과
a | b
1 | 2
아시는분 ~ *
psql 에서 그냥 그렇게 보고 싶은 것이라면,
\x
명령을 실행하고 쿼리를 보내면 결과를 그렇게 보여주고요,
응용프로그램에서 저렇게 쓰기 위해서 쿼리를 만들어야 한다면,
각 칼럼 기준으로 독립된 쿼리를 만들고,
그것을 union all 로 묶어줍니다.
postgres=# select * from t; a | b ---+--- 1 | 2 3 | 4 5 | 6 (3 rows) postgres=# \x Expanded display is on. postgres=# select * from t; -[ RECORD 1 ] a | 1 b | 2 -[ RECORD 2 ] a | 3 b | 4 -[ RECORD 3 ] a | 5 b | 6 postgres=# \x Expanded display is off. postgres=# select 'a' as column_name,a as value ,row_number() over (), 1 as column_order from t ; column_name | value | row_number | column_order -------------+-------+------------+-------------- a | 1 | 1 | 1 a | 3 | 2 | 1 a | 5 | 3 | 1 (3 rows) postgres=# select 'b' as column_name,b as value ,row_number() over (), 2 as column_order from t ; column_name | value | row_number | column_order -------------+-------+------------+-------------- b | 2 | 1 | 2 b | 4 | 2 | 2 b | 6 | 3 | 2 (3 rows) postgres=# select 'b' as column_name,b as value,row_number() over (), 2 as column_order from t union all select 'a' as column_name,a as value,row_number() over (), 1 as column_order from t order by row_number,column_order; column_name | value | row_number | column_order -------------+-------+------------+-------------- a | 1 | 1 | 1 b | 2 | 1 | 2 a | 3 | 2 | 1 b | 4 | 2 | 2 a | 5 | 3 | 1 b | 6 | 3 | 2 (6 rows)
깔깔 상기님 안녕하세요 -ㅂ- 제가 글을 개떡같이 써서 ;;;
다른 답변이 왔네요 ㅋㅋㅋ
포인트는 select (select 'a') <-- 요부분이 a문자열이 아닌 컬럼으로
인식되게 할수 있는 방법을 모색하고 있습니다 ^ ^ ㅎㅎㅎ
알고계시면 답변 부탁드려요 ^ ^
ㅋㅋㅋ 하려는 이유는 select (select 'a') 값이 실제로는
table2
column : k
value : a
select (select k from table2) 을 하려고 보니 문자열로 나온 a가
컬럼으로 인식하지 못해서 컬럼을 서브쿼리처럼 받아서 쓸수 있나해서
ㅋㅋㅋㅋ
원하는 작업은 단일 sql 구문으로는 불가능합니다.
왜냐하면, select 다음 오는 column 세트는 쿼리 실행전에 이미 결정이 나야하거든요.
select (select k from table2) from table1;
형태라면,
그런 부분은 응용 프로그램에서 원하는 칼럼 이름을 뽑는 쿼리와,
그 쿼리의 결과 값을 가지고, 다시 만든 쿼리로 나눠야 하겠죠.
DB 서버 측에서 한 번의 쿼리로 처리 하려면, 사용자 정의 함수를 사용해서
그 안에서 위와 같은 작업을 하는 형태로 만들어야 할 것 같네요.
이를 프로시져 안에서의 동적 쿼리라고 합니다.
이렇게 하지 않고, 어떻게든 하나의 쿼리를 사용해야한다면,
case 구문으로 경우의 수를 모두 나열 해야합니다.
select case when (select k from table2) = 'a' then a
when (select k from table2) = 'b' then b
when (select k from table2) = 'c' then c
....
end as dyncol from table1;
이렇게 되어야 할 것 같은데,
이 부분도, case when 구문의 특수성 때문에, table1 의 a, b, c 칼럼의 자료형이 같아야 정상 작동을 합니다.
----
재미난 질문이었네요.
ㅋㅋㅋ 그렇군요. 상기님 답변 감사드립니다.
혹시나 했는데 안되는군요 ^ ^
언제나 명쾌한 답변 감사드려요 - *