안녕하세요.
user가 생성한 User Defined Type 만 보고싶은데요.
information_schema.columns 에는 현재 column에 적용중인 데이타 타입만 보이고
pg_catalog.pg_type 에는 원하지 않는 모든 데이타 타입 정보들이 보이네요.
데이타 타입을 생성했지만 column에 적용하지 않은 데이타 타입만 보는 방법은 없을까요?
pg_type 테이블의 칼럼들을 잘 보시고, pg_attribute.atttypid 값을 살펴 보아서 not in () 구문을 쓰든지,
except 구문을 쓰든지 해야겠네요.
쿼리가 조금 복잡하겠네요.
여튼, pg_class, pg_type, pg_attribute 테이블들을 모두 사용해야 할 것 같습니다.
(추가)
사용자 정의 자료형이라 함은, 해당 사용자가 만든 자료형 가운데, 테이블을 만들면서 자동으로 만들어진 자료형을 말하지 않는다로 정의하면, 그 정의 대로 쿼리를 만드셔야 할 것 같습니다.
사용자가 테이블이나 뷰를 만들면, 해당 이름과 같은 자료형과, '_' 문자가 앞에 붙은 자료형이 자동으로 만들어집니다. 참고하세요.
not in() 이나 except 구문을 쓰려면
pg_catalog.pg_type 에서 user 가 생성한 UDT 들만 가져오고
거기서 pg_attribute.atttypid 값을 not in() 이나 except 해야 할 것 같은데요
pg_catalog.pg_type에서 UDT만 가져오는 방법을 모르겠네요 ;;
pgcatalog 에서 생성한 type 들과의 차이점이 보이지 않아서요 ///
그 방법이 궁금합니다. 혹시 알 수 있을까요?
(추가) 제가 위에서 말한 사용자 정의 자료형은 create type ~ 명령어로 생성한 자료형입니다.
사용자 정의 자료형은 pg_type.typnamespace 값이 pg_catalog 일 수 없습니다.
이걸로 찾으셔도 됩니다.
커맨드 명령어 /dT 와 같은 결과인 User Defined Type 리스트를 보여주는 쿼리입니다.
SELECT n.nspname as schema, t.typname as type;
FROM pg_type t
LEFT JOIN pg_catalog.pg_namespace n ON n.oid = t.typnamespace
WHERE (t.typrelid = 0 OR (SELECT c.relkind = 'c' FROM pg_catalog.pg_class c WHERE c.oid = t.typrelid))
AND NOT EXISTS(SELECT 1 FROM pg_catalog.pg_type el WHERE el.oid = t.typelem AND el.typarray = t.oid)
AND n.nspname NOT IN ('pg_catalog', 'information_schema')
-------------------------------------------------------------------------------------------------
현재 컬럼에서 사용중이지 않은 User Defined Type 만을 보여주는 쿼리입니다.
AND NOT EXISTS(SELECT 1 FROM pg_attribute at WHERE at.atttypid = t.oid)