PostgresQL로 지정된 행의 레코드를 얻고 싶습니다.

3145 단어 PostgreSQLSQL
검색 조건의 결과 행에서 임의의 행의 레코드만 검색하는 두 가지 방법을 소개합니다.
다음과 같은 테이블을 준비하고 실행 결과와 함께 해설해 갑니다.

준비 ①테이블 작성


CREATE TABLE sample_tbl
(
  objectid bigserial NOT NULL,
  col1 character varying,
  col2 bigint,
  createdate timestamp without time zone,
  CONSTRAINT sample_tbl_pkey PRIMARY KEY (objectid)
)

준비② 샘플 레코드 준비





【실현 방법 1】 ROW_NUMBER 함수 사용



행 번호를 붙인 다음에, 임의의 행 번호로 취득하고 싶은 레코드를 지정하는 방법입니다.
우선 다음과 같은 SQL로 행 번호를 취득할 수 있는 것을 확인할 수 있습니다.
※ROW_NUMBER에 대해
SELECT ROW_NUMBER() OVER() AS rownum , * FROM sample_tbl;

실행 결과


임의의 순서로 행 번호를 붙이는 경우
SELECT ROW_NUMBER() OVER(ORDER BY createdate DESC) AS rownum , * FROM sample_tbl;

실행 결과


이제 createdate 내림차순으로 두 번째 레코드를 얻으려고합니다.
SELECT ROW_NUMBER() OVER(ORDER BY createdate DESC) AS rownum , * FROM sample_tbl WHERE rownum = 2;

이것으로 얻을 수 있다고 생각했는데, 실은 다음과 같은 에러가 나옵니다.


따라서 하위 쿼리여야 합니다.
SELECT * FROM 
 (SELECT ROW_NUMBER() OVER(ORDER BY createdate DESC) AS rownum , * FROM sample_tbl) AS tbl
WHERE tbl.rownum = 2;

네, 제대로 얻을 수 있었습니다.


【실현 방법 그 2】OFFSET와 LIMIT를 사용



마찬가지로 createdate 내림차순으로 두 번째 레코드를 얻는다고 가정 해 봅시다.
다음과 같은 SQL로 얻을 수 있습니다.
SELECT * FROM sample_tbl ORDER BY createdate DESC OFFSET 1 LIMIT 1;

획득했는지 확인할 수 있습니다.


LIMIT는 취득하고 싶은 레코드의 건수이므로 특히 설명은 불필요하다고 생각합니다.
OFFSET은 시작하고 싶은 행이라는 의미는 아니고, 날리는 행수를 의미하고 있으므로, 주의해 주세요.
2건째 이후를 원할 경우는 1건만 날리므로 「OFFSET 1」이 됩니다.
자세한 설명은 여기

요약



심플한 요건에 대응한다면, OFFSET, LIMIT 쪽이 간단하다고 생각했습니다.
다만, ○건목~○건목까지라고 하는 범위 지정은 어느쪽이나 대응할 수 있습니다만,
○건목과 ○건목과 ○건목과 같은 복수의 임의행을 취득하는 경우는 OFFSET, LIMIT가 아니라, ROW_NUMBER를 사용하는 쪽이 유연하게 대응할 수 있다고 생각합니다.

좋은 웹페이지 즐겨찾기