PostgreSQL array_sort로 2차원 배열이 정렬 안 될 때? 깔끔한 해결법과 샘플 코드 예시

2025-11-30

PostgreSQL에는 기본적으로 다차원 배열을 다루는 강력한 기능이 있지만, 때때로 배열 내 배열(2차원 배열)을 정렬하는 과정에서 예상치 못한 동작이나 제약 사항 때문에 어려움을 겪을 수 있습니다.

PostgreSQL의 array_sort(anyarray) 함수는 1차원 배열의 요소를 정렬하는 데 사용됩니다. 하지만 이 함수를 2차원 이상의 배열에 직접 적용하려고 하면 문제가 발생할 수 있습니다.

문제 array_sort 함수는 1차원 배열을 정렬하도록 설계되었기 때문에, 2차원 배열(배열 내 배열)을 입력하면 원하는 대로 '내부 배열 전체'를 기준으로 정렬하지 못하거나 오류를 발생시킬 수 있습니다.

원인
이 함수는 배열의 개별 요소를 비교하여 정렬하며, 2차원 배열에서는 내부 배열 전체가 하나의 요소가 되기 때문에, 기본 비교 연산자로는 어떤 기준으로 정렬해야 할지 명확하지 않습니다. (예
내부 배열의 첫 번째 요소로 정렬할지, 합계로 정렬할지 등)

문제
내부 배열을 특정 기준(예
내부 배열의 2번째 요소)으로 정렬하고 싶지만, array_sort 함수는 정렬 기준을 지정하는 매개변수를 제공하지 않습니다. (PostgreSQL의 ORDER BY 절처럼 복잡한 로직을 배열 함수 내부에서 직접 지원하지 않습니다.)

2차원 배열을 정렬해야 할 때, SQL 함수와 집계 함수를 사용하여 정렬 기준을 명시해 줄 수 있습니다. 가장 일반적인 대체 방법은 배열을 집합(SET)으로 변환하여 정렬하고, 다시 배열로 집계하는 것입니다.

이 방법은 2차원 배열을 행(Row) 형태로 풀어낸 다음, 원하는 정렬 기준을 적용하고, 마지막에 다시 배열로 묶는 (재집계) 표준적인 방식입니다.

이 예제는 내부 배열을 첫 번째 요소를 기준으로 오름차순 정렬하는 방법을 보여줍니다.

-- 2차원 배열을 받아 내부 배열의 첫 번째 요소를 기준으로 정렬하는 함수
CREATE OR REPLACE FUNCTION sort_2d_array_by_first_element(
    input_array INTEGER[][]
)
RETURNS INTEGER[][]
LANGUAGE sql
AS $$
    SELECT 
        ARRAY_AGG(sub_array ORDER BY sub_array[1] ASC)
    FROM 
        UNNEST(input_array) AS sub_array;
$$;
SELECT 
    sort_2d_array_by_first_element(
        ARRAY[[3, 10], [1, 20], [2, 30]]
    );

-- 결과 (내부 배열의 첫 번째 요소(3, 1, 2)를 기준으로 정렬됨):
-- {{1,20},{2,30},{3,10}}

UNNEST(input_array)
2차원 배열을 풀어서, 각 내부 배열([3, 10], [1, 20], [2, 30])을 별도의 행(sub_array)으로 만듭니다.

ORDER BY sub_array[1] ASC
각 행(내부 배열)을 첫 번째 요소(sub_array[1])를 기준으로 정렬합니다. 만약 두 번째 요소(sub_array[2])로 정렬하고 싶다면 이것만 변경하면 됩니다.

ARRAY_AGG(...)
정렬된 행들을 다시 하나의 2차원 배열로 집계하여 반환합니다.

함수를 생성하지 않고, 쿼리 내에서 바로 정렬을 수행하고 싶을 때 LATERAL JOIN을 사용할 수 있습니다.

WITH data_array AS (
    SELECT 
        ARRAY[[9, 100], [4, 50], [7, 80]] AS my_2d_array
)
SELECT 
    T.sorted_array
FROM 
    data_array,
    LATERAL (
        SELECT 
            ARRAY_AGG(sub_array ORDER BY sub_array[2] DESC) AS sorted_array -- 두 번째 요소를 기준으로 내림차순 정렬
        FROM 
            UNNEST(data_array.my_2d_array) AS sub_array
    ) AS T;

-- 결과 (내부 배열의 두 번째 요소(100, 50, 80)를 기준으로 내림차순 정렬됨):
-- {{9,100},{7,80},{4,50}}

LATERAL
메인 쿼리(data_array)의 각 행에 대해 서브쿼리(T)를 실행할 수 있게 해줍니다.

이 방식은 특정 쿼리에서만 정렬이 필요할 때 가장 유연하게 정렬 기준을 변경하여 사용할 수 있습니다.


postgresql



이 네트워크가 저 네트워크에 포함될까? PostgreSQL >>= 연산자로 IP 주소 범위 확인하기

PostgreSQL의 inet과 cidr 데이터 타입은 IPv4 또는 IPv6 주소와 서브넷 정보를 효율적으로 저장하고 처리하기 위해 설계되었습니다. 일반 텍스트(text)나 정수(integer)로 저장하는 것보다 입력 유효성 검사와 특수 연산자/함수를 사용할 수 있다는 장점이 있어요


PostgreSQL atanh() 함수: 흔한 오류와 안전한 사용법 가이드

atanh(x) 함수는 아크 쌍곡선 탄젠트(Inverse Hyperbolic Tangent)를 계산하는 수학 함수입니다. 이 함수는 y=artanh(x) 일 때, tanh(y)=x 를 만족하는 y 값을 반환합니다.atanh(x)를 사용할 때 가장 흔하게 발생하는 문제는 입력값의 범위와 관련된 것입니다


PostgreSQL SELECT LIMIT: 흔한 문제점과 Keyset Pagination 대안 완벽 정리

SELECT . .. LIMIT는 쿼리 결과로 반환할 최대 행(row) 수를 지정하는 데 사용됩니다. 주로 페이지네이션(Pagination), 즉 결과를 여러 페이지로 나누어 보여줄 때나, 단순히 상위 N개의 데이터를 빠르게 확인할 때 사용됩니다



PostgreSQL bytea rtrim 트러블슈팅: 공백 제거 대신 원하는 바이트 자르기

rtrim 함수는 기본적으로 문자열의 오른쪽(trailing)에서 지정된 문자(들)를 제거하는 함수입니다. 일반 문자열(text 또는 varchar)에서는 공백 문자를 제거하는 데 자주 사용되지만, bytea 타입에 적용될 때는 작동 방식에 약간의 차이가 있고


PostgreSQL에서 문자열을 배열로? string_to_array 사용 시 주의할 점은?

string_to_array 함수는 문자열을 배열로 변환하는 데 사용되며, 다음과 같은 문법을 가집니다.string 배열로 변환할 입력 문자열입니다.delimiter 문자열을 분할하는 데 사용할 구분자(예 쉼표 , , 세미콜론 ;, 공백 등)입니다


sepgsql 모듈 트러블슈팅: 접근 거부 오류(Access Denied) 해결법과 대체 보안 전략

sepgsql은 PostgreSQL에 SELinux의 보안 정책을 적용하여, 데이터베이스 객체(테이블, 스키마, 함수 등)에 보안 레이블(Security Label)을 붙여 접근을 강제적으로 통제하는 모듈입니다.MAC (Mandatory Access Control


PostgreSQL 초보 가이드: DROP SCHEMA IF EXISTS와 CASCADE 옵션 완벽 이해

스키마를 삭제할 때 발생하는 일반적인 문제들, 그리고 그러한 상황에서 사용할 수 있는 대체 방법들의 샘플 코드 예시와 함께 친절하고 쉽게 설명해 드릴게요.DROP SCHEMA 명령어는 데이터베이스에서 지정된 스키마를 제거하는 데 사용됩니다


CDC 솔루션 개발자를 위한 팁: pg_logicalinspect와 대체 접근법

PostgreSQL의 pg_logicalinspect 모듈, 즉 논리적 디코딩 컴포넌트 검사 기능에 대해 궁금하시군요. 이 기능은 논리적 복제(Logical Replication)와 관련된 디코딩 프로세스를 이해하고 디버깅하는 데 유용한 도구입니다


PostgreSQL 함수로 Range/Multirange 마스터하기: 오류 방지 및 대체 코드 샘플

한국어로 친절하고 쉽게 설명해 드릴게요. 프로그래밍을 하다가 자주 겪을 수 있는 일반적인 문제와, 그 문제를 해결하기 위한 대체 방법(Multirange 사용 포함)의 샘플 코드 예시를 함께 보시죠!Range(범위) 타입은 값의 단일 연속 구간을 나타냅니다


느린 쿼리 탈출! PostgreSQL 쿼리 최적화 가이드와 실용적인 대안 코드 예시

PostgreSQL 쿼리에 대한 개요, 흔한 문제, 그리고 대안적인 샘플 코드 예시를 친근한 한국어로 설명해 드릴게요.PostgreSQL은 관계형 데이터베이스 관리 시스템(RDBMS)이며, 데이터를 처리하기 위해 SQL(Structured Query Language)을 사용해요