복붙노트

[SQL] 영숫자는 PostgreSQL을 함께 정렬

SQL

영숫자는 PostgreSQL을 함께 정렬

데이터베이스, 나는 다음과 같은 형식의 다양한 영숫자 문자열을 가지고 :

10_asdaasda
100_inkskabsjd
11_kancaascjas
45_aksndsialcn
22_dsdaskjca
100_skdnascbka

나는 그들이 본질적으로 문자열의 앞에있는 번호로 정렬 할 다음 문자열 이름 자체가 있지만, 물론, 문자가 하나와 이름으로 주문의 결과가 발생하므로 하나를 비교합니다 :

10_asdaasda
100_inkskabsjd
100_skdnascbka
11_kancaascjas
22_dsdaskjca
45_aksndsialcn

대신 순서의 내가 선호하는 것 :

10_asdaasda
11_kancaascjas
22_dsdaskjca
45_aksndsialcn
100_inkskabsjd
100_skdnascbka

캐릭터 라인은 바로 앞의 숫자에 의해 분류 된 경우 솔직히, 나는 벌금을 것이다. 나는 PostgreSQL을 너무 익숙하지 않은, 그래서 나는 확실히 가장 좋은 방법이 될 것이라고해야 할 일을하지 않았다. 나는 어떤 도움을 감사하겠습니다!

해결법

  1. ==============================

    1.이상적인 방법은 데이터를 정상화하고 두 개의 개별 열로 컬럼의 두 가지 구성 요소를 분리하는 것입니다. 정수 유형 중 하나, 하나의 텍스트.

    이상적인 방법은 데이터를 정상화하고 두 개의 개별 열로 컬럼의 두 가지 구성 요소를 분리하는 것입니다. 정수 유형 중 하나, 하나의 텍스트.

    현재 테이블로, 당신은 여기 증명과 같은 작업을 수행 할 수 있습니다 :

    WITH x(t) AS (
        VALUES
         ('10_asdaasda')
        ,('100_inkskabsjd')
        ,('11_kancaascjas')
        ,('45_aksndsialcn')
        ,('22_dsdaskjca')
        ,('100_skdnascbka')
        )
    SELECT t
    FROM   x
    ORDER  BY (substring(t, '^[0-9]+'))::int     -- cast to integer
              ,substring(t, '[^0-9_].*$')        -- works as text
    

    동일한 문자열 () 식 열을 분할하기 위해 사용될 수있다.

    정규 표현식은 어느 정도 허용을 비난하고 있습니다 :

    밑줄 세퍼레이터 어쨌든 같은 명확한 경우 split_part ()는 빠르다 :

    ORDER  BY (split_part(t, '_', 1)::int
              ,split_part(t, '_', 2)
    
    SELECT name
    FROM   nametable
    ORDER  BY (split_part(name, '_', 1)::int
              ,split_part(name, '_', 2)
    
  2. ==============================

    2.당신은 문자열과 정규 표현식을 사용할 수 있습니다

    당신은 문자열과 정규 표현식을 사용할 수 있습니다

       order by substring(column, '^[0-9]+')::int, substring(column, '[^0-9]*$')
    
  3. ==============================

    3.식을 통해 인덱스와 함께 할 수있는 방법이있다. 그것은 (I 브래드의 갈 것입니다)하지만 다음의 식 (그것을 할 수있는 더 많은 방법이있다)에 인덱스를 생성 할 수 있습니다 내 선호하는 솔루션이 아닐 것입니다 :

    식을 통해 인덱스와 함께 할 수있는 방법이있다. 그것은 (I 브래드의 갈 것입니다)하지만 다음의 식 (그것을 할 수있는 더 많은 방법이있다)에 인덱스를 생성 할 수 있습니다 내 선호하는 솔루션이 아닐 것입니다 :

    CREATE INDEX idx_name ON table (CAST(SPLIT_PART(columname, '_', 1) AS integer));  
    

    그럼 당신은 당신이 같은 밑줄 문자 앞의 수를 필요로 할 때마다 (정수), '_', SPLIT_PART (columname 1) CAST으로 검색하고 주문할 수 있습니다 :

    SELECT * FROM table ORDER BY CAST(SPLIT_PART(columname, '_', 1) AS integer);  
    

    당신은 일종의 따라뿐만 아니라 다음 ( '_', columname 2) SPLIT_PART에 인덱스를 생성하여 문자열 부분에 동일한 작업을 수행 할 수 있습니다. 내가 말했듯이, 그러나,이 솔루션은 매우 추한 찾을 수 있습니다. 나는 확실히 다음 어쩌면 당신이 여기에 언급 열을 제거, 다른 두 열 (숫자 하나와 문자열 하나)으로 갈 것입니다.

  4. ==============================

    4.당신은 숫자 데이터 유형이있는 데이터베이스와 당신이 가지고있는 문자열 값에 접두사와 같은 값에 새 레코드 집합을 지속에 새 열을 추가해야합니다.

    당신은 숫자 데이터 유형이있는 데이터베이스와 당신이 가지고있는 문자열 값에 접두사와 같은 값에 새 레코드 집합을 지속에 새 열을 추가해야합니다.

    그런 다음 정렬을 위해 제대로 입력 된 숫자 열에 인덱스를 만들 수 있습니다.

  5. from https://stackoverflow.com/questions/11417975/alphanumeric-sorting-with-postgresql by cc-by-sa and MIT license