데이터가 있으면 UPDATE / 데이터가 없으면 INSERT DB에서 흔히 말하는 upsert 구문을 PostgreSQL에서도 사용해보자. INSERT INTO [TABLE] (COLUMN1, COLUMN2, ...) VALUES (VALUE1, VALUE2, ...) ON CONFLICT ([column_name / ON CONSTRAINT constraint_name/ WHERE predicate]) [DO NOTHING] [DO UPDATE SET column1 = value1, ...] ON CONFLICT column_name : 특정 컬럼명을 기준으로 체크하고, 컬럼을 여러 개 넣을수도 있다. ON CONSTRAINT constraint_name : 테이블 생성할 때 만든 constraint ..
PostgreSQL 검색 결과
공간 인덱스 활용 업무를 하는데 공간 연산을 하는 일이 많다. 특정 주소와 비교하여 가까운 거리에 있는 주소를 추출한다거나 500m 또는 1km 이내의 주소들을 추출하는 경우이다. 이럴 때에는 거리 계산이 필요하다. 거리계산하는 함수로 st_distance 를 사용하였는데, 이 공감함수는 공간 인덱스를 타지 못한다는 걸 깨달았다. 500m 이내 데이터를 추출하는데 34초 가량 걸려 개선해야될 필요성을 느꼈다. PostgreSQL 인덱스 생성 CREATE INDEX [인덱스명] ON [테이블명] USING btree (컬럼1, 컬럼2..); 인덱스를 생성할 때에는 보통 위와 같이 사용한다. geometry 데이터 타입인 경우에도 위와 같이 생성하면 인덱스를 탈 줄 알았는데, 잘못 알고 있었다. 공간 인덱스..
뷰(View) 테이블 생성 및 제어 뷰(View) 데이터베이스에 존재하는 일종의 가상의 테이블을 의미한다. 실제 테이블의 행과 열을 가지고 있고, 동일한 방식으로 조회할 수 있으나 실제로 데이터를 저장하는 것은 아니다. 뷰(View) 테이블을 조회하는 순간 원본 테이블로 가서 해당 테이블의 데이터를 보여주는 역할만 수행하는 것이다. 즉, 뷰(View)를 사용하게 되면 여러 테이블이나 뷰를 하나의 테이블처럼 볼 수 있어 편리하다. 뷰(View)의 장점 1. 특정 사용자에게 테이블 전체가 아닌 필요한 필드만을 보여줄 수 있어 보안적으로 좋다. 2. 복잡한 쿼리를 단순화하여 사용할 수 있다. 3. 쿼리를 재사용할 수 있다. 4. 뷰(View)가 참조하는 원본 테이블의 데이터가 변경되면 뷰(View)의 데이터도..
특정 문자열 개수 구하기 특정 문자열의 개수를 파악할 때, 오라클에서는 편리한 REGEXP_COUNT 라는 함수가 존재하는데, 안타깝게도 PostgreSQL은 지원하지 않는다. 그렇다고 구할 수 없는 건 아니다. select length('서울특별시 강남구 역삼동 100') - length(replace('서울특별시 강남구 역삼동 100', ' ', '')) -- 3 나의 경우에는 도로명주소를 파악하고자 위와같이 공백이 들어간 갯수를 파악했다. 위 값을 구하면 3이 나온다. 읍면동의 경우에는 위의 쿼리를 사용했을 때, 3이 나오겠지만, 리까지 있는 동네에는 4가 나올 것이다. 3과 4에 따라서 읍면동/도로명 주소를 구할 수 있다.
SELECT JOIN 결과값 UPDATE 주제는 PostgreSQL이지만 대다수의 DBMS가 공통이다. 보통 UPDATE 쿼리는 아래와 같다. update table_A set name = '미피' where b = 'animal' table_A 테이블에서 a 컬럼을 업데이트하고자 할 때, table_B 테이블의 데이터를 가져와야 할 경우 서브쿼리를 사용 할 수 있는데, 서브쿼리보다 더 간단하게 사용하는 방법이 있다. update table_A set name = b.name from table_B b where id = b.id
PostgreSQL 괄호가 포함된 문자 replace하기 데이터에서 괄호가 포함된 문자를 제거하고자할 때, 정규식을 사용하면 편리하다. 대신 정규식은 속도가 느릴 수 있어 주의해야한다. 서울특별시 용산구 한남대로 59 (한남동) 이라는 데이터가 존재할 때 아래와 같은 쿼리를 작성하면 (한남동) 을 제거할 수 있다. select regexp_replace('서울특별시 용산구 한남대로 59 (한남동)', '\(.*\)', '');
최근댓글