복붙노트

[SQL] 어떻게 쿼리 PostgreSQL의 '그룹화'의 문자열 필드의 CONCATENATE 문자열에?

SQL

어떻게 쿼리 PostgreSQL의 '그룹화'의 문자열 필드의 CONCATENATE 문자열에?

나는 쿼리 그룹 내에서 필드의 문자열을 연결하는 방법을 찾고 있어요. 그래서 예를 들면, 나는 테이블을 가지고 :

ID   COMPANY_ID   EMPLOYEE
1    1            Anna
2    1            Bill
3    2            Carol
4    2            Dave

그리고 내가 좋아하는 뭔가를 얻을 수 COMPANY_ID으로 그룹 원 :

COMPANY_ID   EMPLOYEE
1            Anna, Bill
2            Carol, Dave

가 내장되어 기능 MySQL은이 GROUP_CONCAT을 할

해결법

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

    1.(2010 년 말부터) 포스트 그레스의 최신 버전은 심지어 당신이 구분 문자열을 지정이시키는 string_agg (표현, 구분자) 질문을 요청 정확히 무엇을 할 것인가 기능을 가지고 :

    (2010 년 말부터) 포스트 그레스의 최신 버전은 심지어 당신이 구분 문자열을 지정이시키는 string_agg (표현, 구분자) 질문을 요청 정확히 무엇을 할 것인가 기능을 가지고 :

    SELECT company_id, string_agg(employee, ', ')
    FROM mytable
    GROUP BY company_id;
    

    포스트 그레스 9.0은 모든 집계 식의 ORDER BY 절을 지정할 수있는 기능을 추가; 그렇지 않은 경우, 순서는 정의되지 않는다. 지금 쓸 수 있습니다 :

    SELECT company_id, string_agg(employee, ', ' ORDER BY employee)
    FROM mytable
    GROUP BY company_id;
    

    또는 실제로 :

    SELECT string_agg(actor_name, ', ' ORDER BY first_appearance)
    

    (2009)의 PostgreSQL 8.4 배열에 값을 연결 집계 array_agg 함수 (식)를 도입했다. 그런) (array_to_string 원하는 결과를 제공하는데 사용될 수있다 :

    SELECT company_id, array_to_string(array_agg(employee), ', ')
    FROM mytable
    GROUP BY company_id;
    

    경우에는 누군가가 미리 9.0 데이터베이스에 대한 호환성 심 찾고이 건너 온다, ORDER BY 절을 제외하고 string_agg 모든 것을 구현하는 것이 가능하다.

    그래서 함께하면 정의 아래 이것은 9.x의 포스트 그레스 DB에서와 동일하게 작동한다 :

    SELECT string_agg(name, '; ') AS semi_colon_separated_names FROM things;
    

    그러나 이것은 구문 오류가있을 것입니다 :

    SELECT string_agg(name, '; ' ORDER BY name) AS semi_colon_separated_names FROM things;
    --> ERROR: syntax error at or near "ORDER"
    

    PostgreSQL의 8.3에서 테스트.

    CREATE FUNCTION string_agg_transfn(text, text, text)
        RETURNS text AS 
        $$
            BEGIN
                IF $1 IS NULL THEN
                    RETURN $2;
                ELSE
                    RETURN $1 || $3 || $2;
                END IF;
            END;
        $$
        LANGUAGE plpgsql IMMUTABLE
    COST 1;
    
    CREATE AGGREGATE string_agg(text, text) (
        SFUNC=string_agg_transfn,
        STYPE=text
    );
    

    9.0 이전에, 어떤이 내장되지-에 한 집계 함수 CONCATENATE 문자열. (많은 다른 사람의 사이에서,이 메일 링리스트 게시물에 바즈 가보에 의해 제안) 간단한 사용자 정의 구현이 내장 textcat 기능을 사용하는 것입니다 (이는 || 연산자 뒤에 거짓말) :

    CREATE AGGREGATE textcat_all(
      basetype    = text,
      sfunc       = textcat,
      stype       = text,
      initcond    = ''
    );
    

    여기에 집계 문서를 만들 수 있습니다.

    이것은 단순히 어떤 분리와 함께 모든 문자열을 접착제. 말을하지 않고 ","그들 사이에 삽입 취득하기 위하여는, 당신은 당신의 자신의 연결 기능을하고 위의 "textcat"을 위해 그것을 대체 할 수 있습니다. 여기에 하나 내가 함께 넣어 8.3.12에서 테스트입니다 :

    CREATE FUNCTION commacat(acc text, instr text) RETURNS text AS $$
      BEGIN
        IF acc IS NULL OR acc = '' THEN
          RETURN instr;
        ELSE
          RETURN acc || ', ' || instr;
        END IF;
      END;
    $$ LANGUAGE plpgsql;
    

    이 같은 출력을 얻을 수 있도록이 버전의 뜻 출력은 행의 값이 null 또는 빈 쉼표 경우에도 :

    a, b, c, , e, , g
    

    당신은 출력이 여분의 쉼표를 제거하는 것을 선호하는 경우 :

    a, b, c, e, g
    

    다음과 같이 함수에 ELSIF 검사를 추가 :

    CREATE FUNCTION commacat_ignore_nulls(acc text, instr text) RETURNS text AS $$
      BEGIN
        IF acc IS NULL OR acc = '' THEN
          RETURN instr;
        ELSIF instr IS NULL OR instr = '' THEN
          RETURN acc;
        ELSE
          RETURN acc || ', ' || instr;
        END IF;
      END;
    $$ LANGUAGE plpgsql;
    
  2. ==============================

    2.어떻게 포스트 그레스를 사용하는 방법에 대한 내장 배열 함수? 8.4에 적어도이 상자 밖으로 작동합니다 :

    어떻게 포스트 그레스를 사용하는 방법에 대한 내장 배열 함수? 8.4에 적어도이 상자 밖으로 작동합니다 :

    SELECT company_id, array_to_string(array_agg(employee), ',')
    FROM mytable
    GROUP BY company_id;
    
  3. ==============================

    3.PostgreSQL의 9.0에서로서 당신은 string_agg라는 집계 함수를 사용할 수 있습니다. 새 SQL 이런 식으로 뭔가 보일 것입니다 : SELECT COMPANY_ID, string_agg을 (직원, ',') MYTABLE FROM GROUP BY는 COMPANY_ID;

    PostgreSQL의 9.0에서로서 당신은 string_agg라는 집계 함수를 사용할 수 있습니다. 새 SQL 이런 식으로 뭔가 보일 것입니다 : SELECT COMPANY_ID, string_agg을 (직원, ',') MYTABLE FROM GROUP BY는 COMPANY_ID;

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

    4.나는 약간의 검색 후 그것을 발견하기 때문에 나는 대답을 더 신용을 주장하지 않습니다 :

    나는 약간의 검색 후 그것을 발견하기 때문에 나는 대답을 더 신용을 주장하지 않습니다 :

    내가 몰랐 PostgreSQL을 사용하면 AGGREGATE를 작성하여 자신의 집계 함수를 정의 할 수 있다는 것입니다

    PostgreSQL의 목록 쇼에이 포스팅은 어떻게 사소한는 필요한 무엇을 할 수있는 기능을 만드는 것입니다 :

    CREATE AGGREGATE textcat_all(
      basetype    = text,
      sfunc       = textcat,
      stype       = text,
      initcond    = ''
    );
    
    SELECT company_id, textcat_all(employee || ', ')
    FROM mytable
    GROUP BY company_id;
    
  5. ==============================

    5.이미 언급 한 바와 같이, 자신의 집계 함수를 작성하는 것은 옳은 일이다. 여기 내 연결 집계 함수이다 (당신은 프랑스어로 정보를 찾을 수 있습니다)

    이미 언급 한 바와 같이, 자신의 집계 함수를 작성하는 것은 옳은 일이다. 여기 내 연결 집계 함수이다 (당신은 프랑스어로 정보를 찾을 수 있습니다)

    CREATE OR REPLACE FUNCTION concat2(text, text) RETURNS text AS '
        SELECT CASE WHEN $1 IS NULL OR $1 = \'\' THEN $2
                WHEN $2 IS NULL OR $2 = \'\' THEN $1
                ELSE $1 || \' / \' || $2
                END; 
    '
     LANGUAGE SQL;
    
    CREATE AGGREGATE concatenate (
      sfunc = concat2,
      basetype = text,
      stype = text,
      initcond = ''
    

    );

    그리고 그것을로 사용 :

    SELECT company_id, concatenate(employee) AS employees FROM ...
    
  6. ==============================

    6.당신은 8.4로 업그레이드됩니다 경우이 최근 발표 목록 조각은 관심의 대상이 될 수 있습니다 :

    당신은 8.4로 업그레이드됩니다 경우이 최근 발표 목록 조각은 관심의 대상이 될 수 있습니다 :

    나는 8.4 개발 문서에 링크 거라고하지만 그들은 아직이 기능을 표시하지 않는 것.

  7. ==============================

    7., 케빈의 대답에 위로 다음은 포스트 그레스 워드 프로세서를 사용하여 :

    , 케빈의 대답에 위로 다음은 포스트 그레스 워드 프로세서를 사용하여 :

    첫째로, 상기 요소들의 어레이를 생성 한 후 사용하는 내장 함수 array_to_string.

    CREATE AGGREGATE array_accum (anyelement)
    (
     sfunc = array_append,
     stype = anyarray,
     initcond = '{}'
    );
    
    select array_to_string(array_accum(name),'|') from table group by id;
    
  8. ==============================

    8.문자열 연결의 사용자 정의 집계 함수의 사용에 다시 한번 다음은 당신이 선택 사항이이 하위 절에 의한 주문 문에서에서 선택해야 할 것이다, 그래서 어떤 순서로 행을 배치하고 것을 기억해야합니다 다음 외부 따라서, 문자열을 집계 GROUP BY 절과 함께 선택 :

    문자열 연결의 사용자 정의 집계 함수의 사용에 다시 한번 다음은 당신이 선택 사항이이 하위 절에 의한 주문 문에서에서 선택해야 할 것이다, 그래서 어떤 순서로 행을 배치하고 것을 기억해야합니다 다음 외부 따라서, 문자열을 집계 GROUP BY 절과 함께 선택 :

    SELECT custom_aggregate(MY.special_strings)
    FROM (SELECT special_strings, grouping_column 
            FROM a_table 
            ORDER BY ordering_column) MY
    GROUP BY MY.grouping_column
    
  9. ==============================

    9.http://www.postgresql.org/docs/8.0/interactive/functions-conditional.html : 나는 도움이 PostgreSQL의 문서를 발견했다.

    http://www.postgresql.org/docs/8.0/interactive/functions-conditional.html : 나는 도움이 PostgreSQL의 문서를 발견했다.

    필드가 비어 있지 않은 경우 내 경우, 나는, 주위 브라켓 필드를 연결하는 일반 SQL을 찾았다.

    select itemid, 
      CASE 
        itemdescription WHEN '' THEN itemname 
        ELSE itemname || ' (' || itemdescription || ')' 
      END 
    from items;
    
  10. ==============================

    10.PostgreSQL의와 Google BigQuery의 SQL에 대한 사용 STRING_AGG 기능 :

    PostgreSQL의와 Google BigQuery의 SQL에 대한 사용 STRING_AGG 기능 :

    SELECT company_id, STRING_AGG(employee, ', ')
    FROM employees
    GROUP BY company_id;
    
  11. ==============================

    11.버전의 PostgreSQL 9.0 이상에 따르면 당신은 string_agg라는 집계 함수를 사용할 수 있습니다. 새 SQL은 다음과 같이 보일 것이다 :

    버전의 PostgreSQL 9.0 이상에 따르면 당신은 string_agg라는 집계 함수를 사용할 수 있습니다. 새 SQL은 다음과 같이 보일 것이다 :

    SELECT company_id, string_agg(employee, ', ')
        FROM mytable GROUP BY company_id;
    
  12. ==============================

    12.또한 포맷 기능을 사용할 수 있습니다. 어떤 암시 자체의 텍스트 형식 변환, INT, 등의 치료를 취할 수 있습니다.

    또한 포맷 기능을 사용할 수 있습니다. 어떤 암시 자체의 텍스트 형식 변환, INT, 등의 치료를 취할 수 있습니다.

    create or replace function concat_return_row_count(tbl_name text, column_name text, value int)
    returns integer as $row_count$
    declare
    total integer;
    begin
        EXECUTE format('select count(*) from %s WHERE %s = %s', tbl_name, column_name, value) INTO total;
        return total;
    end;
    $row_count$ language plpgsql;
    
    
    postgres=# select concat_return_row_count('tbl_name','column_name',2); --2 is the value
    
  13. ==============================

    13.나는 JetBrains의 라이더를 사용하고 있는데 JSON에서 모든 포장 듯하기 때문에 위의 예제의 결과를 복사하는 번거 로움 재 - 실행했다. 이것은 실행하기 쉬웠다 하나의 문장으로 그들을 결합

    나는 JetBrains의 라이더를 사용하고 있는데 JSON에서 모든 포장 듯하기 때문에 위의 예제의 결과를 복사하는 번거 로움 재 - 실행했다. 이것은 실행하기 쉬웠다 하나의 문장으로 그들을 결합

    select string_agg('drop table if exists "' || tablename || '" cascade', ';') 
    from pg_tables where schemaname != $$pg_catalog$$ and tableName like $$rm_%$$
    
  14. ==============================

    14.당신이 string_agg가 지원되지 아마존 Redshift에,에있는 경우, listagg를 사용해보십시오.

    당신이 string_agg가 지원되지 아마존 Redshift에,에있는 경우, listagg를 사용해보십시오.

    SELECT company_id, listagg(EMPLOYEE, ', ') as employees
    FROM EMPLOYEE_table
    GROUP BY company_id;
    
  15. from https://stackoverflow.com/questions/43870/how-to-concatenate-strings-of-a-string-field-in-a-postgresql-group-by-query by cc-by-sa and MIT license