About
home
Tmax OpenSQL
home
💻

33. Contrib Extensions - 데이터 타입

작성자
SYB
Contrib Extension 에서 데이터 타입을 추가로 제공하는 Extension을 모아서 정리해봤습니다.
citext
cube
hstore
isn
lo
ltree
seg

citext

이름대로 citext라는 데이터 유형을 제공합니다. text와 거의 동일하게 동작하나, 대소문자를 구별하지 않고 lower 값을 비교할 때 호출됩니다. search_path에 citext를 등록해야 text보다 먼저 호출될 수 있습니다.

예시

nick 행이 text/citext 유형인 2개의 테이블을 만들어, select로 검사하여 citext의 동작을 확인하는 예시입니다.
CREATE TABLE users1 ( nick TEXT PRIMARY KEY, pass TEXT NOT NULL --nick의 패스워드를 임의로랜덤으로 생성 ); INSERT INTO users1 VALUES ( 'larry', sha256(random()::text::bytea) ); SELECT * FROM users1 WHERE nick = 'Larry'; -- pg는 대문자 L과 소문자 l을 구분하여 Larry 데이터 검색이 되지 않음 nick | pass ------+------ (0 rows) CREATE TABLE users2 ( nick CITEXT PRIMARY KEY, pass TEXT NOT NULL ); INSERT INTO users2 VALUES ( 'larry', sha256(random()::text::bytea) ); SELECT * FROM users2 WHERE nick = 'Larry'; -- citext 데이터 유형을 통해 대문자 L과 소문자 l을 구분하지 않고 검색이 되어 larry의 데이터를 볼수 있음 nick | pass -------+-------------------------------------------------------------------- larry | \xb0672e2f1de116dbb93fdef8826b49157358d7e7a7aa06f8da0310c432995588
SQL
복사

참고사이트

공식 git hub contrib 참고 :
sample sql
sample sql 결과

cube

다차원 큐브를 나타내는 데이터 유형을 구현합니다.
syntex
syntex 정리
precision
값은 내부적으로 64비트 부동 소수점 숫자로 저장됩니다. 유효 숫자가 16개 이상인 숫자는 잘립니다.
같이 제공되는 연산자
연산자 정리
같이 제공되는 함수
함수 정리

예시

cube 데이터 유형을 이용해 cube에서 제공하는 연산자와 함수를 사용하는 예시입니다.
SELECT '1'::cube AS cube; cube ------ (1) (1 row) SELECT '-1'::cube AS cube; cube ------ (-1) (1 row) SELECT '(0),(0)'::cube AS cube; cube ------ (0) (1 row) SELECT '(0),(1)'::cube AS cube; cube --------- (0),(1) (1 row) SELECT '[(0,0,0,0),(0,0,0,0)]'::cube AS cube; cube -------------- (0, 0, 0, 0) (1 row) SELECT cube(cube(1,2),3); cube --------------- (1, 3),(2, 3) (1 row) SELECT cube_subset(cube('(1,3,5),(6,7,8)'), ARRAY[3,2,1,1]); cube_subset --------------------------- (5, 3, 1, 1),(8, 7, 6, 6) (1 row) SELECT cube('(1,2),(1,2)'); -- cube_in cube -------- (1, 2) (1 row) SELECT '24, 33.20'::cube = '24, 33.20'::cube AS bool; bool ------ t (1 row) SELECT '0,0,1'::cube @> '0,0,0'::cube AS bool; bool ------ f (1 row) SELECT cube_distance('(0)'::cube,'(2,2,2,2)'::cube); cube_distance --------------- 4 (1 row) SELECT cube_dim('(0)'::cube); cube_dim ---------- 1 (1 row) SELECT cube_ll_coord('(-1,1),(2,-2)'::cube, 1); cube_ll_coord --------------- -1 (1 row) SELECT cube_ur_coord('(-1,1),(2,-2)'::cube, 1); cube_ur_coord --------------- 2 (1 row) SELECT cube_is_point('(0)'::cube); cube_is_point --------------- t (1 row) SELECT cube_enlarge('(0)'::cube, 0, 0); cube_enlarge -------------- (0) (1 row) SELECT cube_union('(1,2),(3,4)'::cube, '(5,6,7),(8,9,10)'::cube); cube_union ---------------------- (1, 2, 0),(8, 9, 10) (1 row) SELECT cube_inter('(1,2),(10,11)'::cube, '(3,4), (16,15)'::cube); -- intersects cube_inter ----------------- (3, 4),(10, 11) (1 row) SELECT distance_taxicab('(2,2),(10,10)'::cube, '(0,0),(5,5)'::cube); distance_taxicab ------------------ 0 (1 row) SELECT distance_chebyshev('(2,2),(10,10)'::cube, '(0,0),(5,5)'::cube); distance_chebyshev -------------------- 0 (1 row)
SQL
복사

참고사이트

hstore

단일 값 내에 key - value 세트를 저장하기 위한 데이터 유형을 구현합니다. key 와 value는 단순한 text 문자열입니다. hstore의 각 키는 고유합니다. 중복 키를 사용하여 선언하면 하나만 저장되며, 어떤 키가 유지될 지 보장할 수 없습니다. 또한 값은 NULL이 선언 될 수 있습니다. NULL을 일반 문자열로 처리하려면 "NULL" 과 같이 사용합니다.
같이 제공되는 연산자
연산자 정리
같이 제공되는 함수
함수 정리

예시

다음은 hstore에서 제공하는 기능을 통해 key - value를 다루는 예시입니다.
select 'a=>b'::hstore; hstore ---------- "a"=>"b" (1 row) select '"a"=> "b"'::hstore; hstore ---------- "a"=>"b" (1 row) select ('aa=>"NULL", c=>d , b=>16'::hstore->'aa') is null; ?column? ---------- f (1 row) select exist('a=>NULL, b=>qq', 'a'); exist ------- t (1 row) select defined('a=>NULL, b=>qq', 'a'); defined --------- f (1 row) select delete('a=>1 , b=>2, c=>3'::hstore, 'a'); delete -------------------- "b"=>"2", "c"=>"3" (1 row) select pg_column_size(hstore(v)) = pg_column_size('a=>1, b=>"foo", c=>"1.2", d=>"3", e=>"0"'::hstore) from testhstore1 v; ?column? ---------- t (1 row) select populate_record(v, hstore('c', '3.45')) from testhstore1 v; populate_record ------------------ (1,foo,3.45,3,0) (1 row) select hstore_to_array('aa=>1, cq=>l, b=>g, fg=>NULL'::hstore); hstore_to_array ------------------------- {b,g,aa,1,cq,l,fg,NULL} (1 row) CREATE TABLE test (col1 integer, col2 text, col3 text); SELECT * FROM populate_record(null::test, '"col1"=>"456", "col2"=>"zzz"'); col1 | col2 | col3 ------+------+------ 456 | zzz | (1 row)
SQL
복사

참고사이트

isn

EAN13, UPC, ISBN(도서), ISMN(음악) 및 ISSN(연재물) 과 같은 국제 제품 번호 지정 표준에 대한 데이터 유형을 제공합니다. 숫자는 하드 코딩된 접두사 목록에 따라 입력시 valid check가 진행됩니다. 접두사 목록이 변경되면 다시 컴파일해야하기 때문에 추후 이 모듈의 접두사 valid check 지원이 중단 될 수 있습니다.
데이터 유형 정리
데이터유형
설명
EAN13
유럽 품목 번호, 항상 EAN13 표시 형식으로 표시
ISBN13
새로운 EAN13 표시 형식으로 표시될 국제 표준 도서 번호
ISMN13
새로운 EAN13 표시 형식으로 표시되는 국제 표준 음악 번호
ISSN13
새로운 EAN13 표시 형식으로 표시될 국제 표준 일련 번호
ISBN
기존의 짧은 표시 형식으로 표시되는 국제 표준 도서 번호
ISMN
기존의 짧은 표시 형식으로 표시되는 국제 표준 음악 번호
ISSN
기존의 짧은 표시 형식으로 표시되는 국제 표준 일련 번호
UPC
범용 제품 코드
같이 제공되는 함수
함수 정리

예시

다음은 isn 데이터 유형 및 함수를 테스트하는 예시입니다.
CREATE TABLE test_isn (id isbn); INSERT INTO test_isn VALUES('9780393040029'); INSERT INTO test_isn VALUES('220500896?'); INSERT INTO test_isn VALUES('978055215372?'); postgres=# select * from test_isn; id --------------- 0-393-04002-X 2-205-00896-X 0-552-15372-9 (3 rows) SELECT isn_weak(true); INSERT INTO test_isn VALUES('978-0-11-000533-4'); INSERT INTO test_isn VALUES('9780141219307'); INSERT INTO test_isn VALUES('2-205-00876-X'); SELECT isn_weak(false); SELECT id FROM test_isn WHERE NOT is_valid(id); -- 끝에 !로 유효하지 않은 숫자 확인 id ---------------- 0-11-000533-3! 0-14-121930-0! 2-205-00876-5! (3 rows) UPDATE test_isn SET id = make_valid(id) WHERE id = '2-205-00876-X!'; SELECT * FROM test_isn; id ---------------- 0-393-04002-X 2-205-00896-X 0-552-15372-9 0-11-000533-3! 0-14-121930-0! 2-205-00876-5 -- < make_valid로 유효하지 않은 2-205-00876-X! 데이터의 flag(!) 클리어 (6 rows) SELECT isbn13(id) FROM test_isn; isbn13 -------------------- 978-0-393-04002-9 978-2-205-00896-8 978-0-552-15372-0 978-0-11-000533-1! 978-0-14-121930-1! 978-2-205-00876-0 -- < isbn13으로 유효한 값 변환 확인 (6 rows)
SQL
복사

참고사이트

lo

대형 개체(BLOB) 관리를 지원합니다. 데이터 유형 lo와 lo_manage라는 트리거를 지원합니다. 기존에도 blob형 데이터를 oid로 지정해서 다룰 수도 있지만, lo 모듈을 이용해 blob형 데이터를 lo로 지정하여 lo_manage 트리거를 통해 oid를 쿼리에서 다루지 않게 됩니다. 따라서 일반 데이터의 oid와 헷갈리지 않게되어 관리측면에서 유리해집니다.

예시

blob형 데이터를 다룰 테이블을 생성하고, 간단한 예시 이미지를 다루는 과정의 예시입니다.
이미지 파일 경로
[opensql@localhost:image]$ pwd /opensql/image [opensql@localhost:image]$ ls -arlt total 100 -rw-r--r--. 1 opensql opensql 48248 Aug 24 00:51 pgele.png drwx------. 16 opensql opensql 4096 Aug 24 00:51 .. -rw-r--r--. 1 opensql opensql 48248 Aug 24 01:25 pgele2.png drwxrwxr-x. 2 opensql opensql 41 Aug 24 01:25 .
SQL
복사
기본 제공되는 oid 사용 시
CREATE TABLE image ( name text, raster oid ); INSERT INTO image (name, raster) VALUES ('beautiful image', lo_import('/etc/motd', 68583)); -- 임의로 oid를 지정해서 넣게 되는데, 기존에 있던 일반 데이터의 oid일 수 있어서 다시 지정해줘야함. -- 일반 데이터의 oid와 헷갈리면 안되므로 insert/update/delete 실행할 때 마다 oid를 신경써야함.
SQL
복사
lo 모듈 사용 시
CREATE TABLE a (fname name,image lo); INSERT INTO a VALUES ('empty'); INSERT INTO a VALUES ('pgele.png', lo_import('/opensql/image/pgele.png')::lo); -- lo타입을 써서 테이블에 insert SELECT *,image::oid from a; -- oid로 자동 배정 확인 SELECT oid FROM pg_largeobject_metadata; -- largeobjet로 배정되는 내용 확인. oid가 생성되지만 oid로 데이터를 다루지는 않음 oid ------- 32740 -- oid 는 다를 수 있음 (1 row) CREATE TRIGGER t_a BEFORE UPDATE OR DELETE ON a FOR EACH ROW EXECUTE PROCEDURE lo_manage(image); INSERT INTO a VALUES ('pgele2.png', lo_import('/opensql/image/pgele2.png')); -- 구문에 lo를 쓰지않고도 트리거를 통해 저절로 lo 및 oid 배정됨 SELECT * FROM a; -- 내용 확인 SELECT oid FROM pg_largeobject_metadata; oid ------- 32740 32775 (2 rows) delete from a where fname ='pgele2.png'; SELECT * FROM a; --pgele2.png 삭제 후 내용 확인 SELECT oid FROM pg_largeobject_metadata; --삭제시에도 트리거가 자동으로 largeobject oid까지 삭제해줌 oid ------- 32740 (1 row) select lo_export(a.image, '/opensql/image/pgele_copy.png') from a where fname='pgele.png'; -- 기존 방식처럼 lo_export 사용 가능. 저장된 pgele.png 이미지를 pgele_copy.png라는 다른 이름의 이미지로 export lo_export ----------- 1 (1 row)
SQL
복사
이미지파일 export 확인
[opensql@localhost:image]$ pwd /opensql/image [opensql@localhost:image]$ ls -arlt total 100 -rw-r--r--. 1 opensql opensql 48248 Aug 24 00:51 pgele.png drwx------. 16 opensql opensql 4096 Aug 24 00:51 .. -rw-r--r--. 1 opensql opensql 48248 Aug 24 01:25 pgele2.png drwxrwxr-x. 2 opensql opensql 41 Aug 24 01:25 . -rw-r--r--. 1 opensql opensql 48248 Aug 24 01:32 pgele_copy.png
SQL
복사

참고사이트

ltree

계층적 트리와 같은 구조에서 저장된 데이터의 레이블을 나타내기 위한 데이터 유형 ltree를 구현합니다. 레이블 트리를 통해 검색할 수 있는 광범위한 기능이 제공됩니다.
정의
레이블은 일련의 영숫자 문자와 밑줄입니다(예: C locale에서는 문자 A-Za-z0-9_가 허용됨 ). 레이블은 256자 미만이어야 합니다. 레이블 경로는 점으로 구분된 0개 이상의 레이블 시퀀스입니다. 레이블 경로의 길이는 65535개 레이블을 초과할 수 없습니다.
ltree는 레이블 경로를 저장합니다.
lquery는 ltree 값을 일치시키기 위한 정규식과 같은 패턴을 나타냅니다.
같이 제공되는 연산자
연산자 정리
같이 제공되는 함수
함수 정리

예시

ltree에 대한 예시와 이를 설명합니다. 다음은 테이블을 생성하여 데이터를 insert하는데, 트리형태로 그림과같이 표현됩니다.
--데이터는 contrib/ltree/ltreetest.sql에서도 제공합니다. CREATE TABLE test (path ltree); INSERT INTO test VALUES ('Top'); INSERT INTO test VALUES ('Top.Science'); INSERT INTO test VALUES ('Top.Science.Astronomy'); INSERT INTO test VALUES ('Top.Science.Astronomy.Astrophysics'); INSERT INTO test VALUES ('Top.Science.Astronomy.Cosmology'); INSERT INTO test VALUES ('Top.Hobbies'); INSERT INTO test VALUES ('Top.Hobbies.Amateurs_Astronomy'); INSERT INTO test VALUES ('Top.Collections'); INSERT INTO test VALUES ('Top.Collections.Pictures'); INSERT INTO test VALUES ('Top.Collections.Pictures.Astronomy'); INSERT INTO test VALUES ('Top.Collections.Pictures.Astronomy.Stars'); INSERT INTO test VALUES ('Top.Collections.Pictures.Astronomy.Galaxies'); INSERT INTO test VALUES ('Top.Collections.Pictures.Astronomy.Astronauts'); CREATE INDEX path_gist_idx ON test USING GIST (path); CREATE INDEX path_idx ON test USING BTREE (path);
SQL
복사
Top / | \ Science Hobbies Collections / | \ Astronomy Amateurs_Astronomy Pictures / \ | Astrophysics Cosmology Astronomy / | \ Galaxies Stars Astronauts
SQL
복사
경로 일치 예시입니다.
SELECT path FROM test WHERE path ~ '*.Astronomy.*'; path ----------------------------------------------- Top.Science.Astronomy Top.Science.Astronomy.Astrophysics Top.Science.Astronomy.Cosmology Top.Collections.Pictures.Astronomy Top.Collections.Pictures.Astronomy.Stars Top.Collections.Pictures.Astronomy.Galaxies Top.Collections.Pictures.Astronomy.Astronauts (7 rows) SELECT path FROM test WHERE path ~ '*.!pictures@.Astronomy.*'; path ------------------------------------ Top.Science.Astronomy Top.Science.Astronomy.Astrophysics Top.Science.Astronomy.Cosmology (3 rows)
SQL
복사
전테 텍스트 검색의 예시입니다.
SELECT path FROM test WHERE path @ 'Astro*% & !pictures@'; path ------------------------------------ Top.Science.Astronomy Top.Science.Astronomy.Astrophysics Top.Science.Astronomy.Cosmology Top.Hobbies.Amateurs_Astronomy (4 rows) SELECT path FROM test WHERE path @ 'Astro* & !pictures@'; path ------------------------------------ Top.Science.Astronomy Top.Science.Astronomy.Astrophysics Top.Science.Astronomy.Cosmology (3 rows)
SQL
복사
함수를 사용한 경로 구성의 예시입니다.
SELECT subpath(path,0,2)||'Space'||subpath(path,2) FROM test WHERE path <@ 'Top.Science.Astronomy'; ?column? ------------------------------------------ Top.Science.Space.Astronomy Top.Science.Space.Astronomy.Astrophysics Top.Science.Space.Astronomy.Cosmology (3 rows)
SQL
복사
경로의 지정된 위치에 레이블을 삽입하는 SQL 함수를 만들어 이를 단순화 할 수 있습니다.
CREATE FUNCTION ins_label(ltree, int, text) RETURNS ltree AS 'select subpath($1,0,$2) || $3 || subpath($1,$2);' LANGUAGE SQL IMMUTABLE; SELECT ins_label(path,2,'Space') FROM test WHERE path <@ 'Top.Science.Astronomy'; ins_label ------------------------------------------ Top.Science.Space.Astronomy Top.Science.Space.Astronomy.Astrophysics Top.Science.Space.Astronomy.Cosmology (3 rows)
SQL
복사

참고사이트

seg

선분 또는 부동 소수점 간의 간격을 나타내는 데이터 유형을 지원합니다. 또한 다른 분야의 학문에서 요구하는 세부적인 수치를 구현하는데도 용이합니다. 예를 들어, 측정학에서는 6.5와 6.50이라는 수치는 다르게 인식되는데, 기본 float 형식으로 6.50을 저장하게되면 PostgreSQL에서는 6.5로 출력이 되어 데이터를 다루기 힘들어집니다. text 형태로 저장하는 방법도 있겠지만, 숫자 간격으로 데이터를 다루고 싶을 때는 text 데이터 유형은 이를 활용하지 못합니다.

예시

float8 데이터유형과 seg로 소수점 데이터를 표현하는 예시와, 연산자를 활용하는 예시입니다.
select '6.50' :: float8 as "pH"; pH --- 6.5 (1 row) select '6.50'::seg as "pH"; pH ------ 6.50 --똑같은 6.50 데이터를 표현하는 방식이 다름 (1 row) SELECT '-1e7'::seg AS seg; seg -------- -1e+07 -- 지수를 표현할 때도 세부적으로 저장됨을 보여줌 (1 row) SELECT '0(+-)1'::seg AS seg; seg --------- -1 .. 1 (1 row) SELECT '0(+-)1.0'::seg AS seg; seg ------------- -1.0 .. 1.0 -- delta(간격)에 따라 그에 맞는 값을 출력 (1 row) SELECT '24 .. 33.20'::seg = '24 .. 33.20'::seg AS bool; bool ------ t (1 row) SELECT '24 .. 33.2'::seg = '24 .. 33.20'::seg AS bool; bool ------ f -- 확실하게 소수점 아래 0자리도 다른 숫자로 구분함을 보여줌 (1 row)
SQL
복사

참고사이트

지금까지 ‘PostgreSQL의 Contrib Extensions - 데이터 타입’에 관해 알아보았습니다
‘PostgreSQL의 pgcryto’을 바로 이어서 확인해보세요!

자유롭게 댓글을 남겨주세요