복붙노트

[SQL] 두 개의 열을 결합하여 하나 개의 새로운 컬럼에 추가

SQL

두 개의 열을 결합하여 하나 개의 새로운 컬럼에 추가

PostgreSQL을, 나는 두 개의 열을 결합하고 그들로부터 새 열을 생성하는 SQL 문을 사용하려고합니다.

나는 (...) CONCAT를 사용하는 방법에 대해 생각하고 있어요,하지만 더 좋은 방법은 무엇입니까? 이 작업을 수행하는 가장 좋은 방법은 무엇입니까?

해결법

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

    1.일반적으로, 나는 @의 kgrittn의 조언에 동의합니다. 그것을 위해 이동합니다.

    일반적으로, 나는 @의 kgrittn의 조언에 동의합니다. 그것을 위해 이동합니다.

    그러나 CONCAT에 대한 기본적인 질문을 해결하기 위해 () : 당신이 null 값을 처리해야하는 경우 새로운 기능 CONCAT ()가 유용하다 - 그리고 널 (null)이 둘 귀하의 질문에 나 당신이 참조하는 하나의 배제 없습니다.

    당신은 널 (null) 값, 좋은 오래된 (SQL 표준) 연결 연산자를 배제 할 수있는 경우 || 여전히 최선의 선택이며, @luis '대답은 잘입니다 :

    SELECT col_a || col_b;
    

    당신의 열 중 하나가 널이 될 수있는 경우, 결과는이 경우에 null이 될 것입니다. 당신은 유착으로 방어 할 수있다 :

    SELECT COALESCE(col_a, '') || COALESCE(col_b, '');
    

    그러나 이상의 인수 빠르게 지루한 얻을. CONCAT ()는 모든 인수가 null이없는 경우에도, 널 (null)을 반환하지하는 들어오는 곳이다. 문서 별 :

    SELECT concat(col_a, col_b);
    

    모든 입력 열이 우리가 아직 빈 문자열 ''를 얻을 수있는 경우에 null의 경우 두 대안에 대한 나머지 코너 케이스이지만, 하나는 (적어도 나는 것) 대신에 널 (null)을 할 수 있습니다. 한 가지 가능한 방법 :

    SELECT CASE
              WHEN col_a IS NULL THEN col_b
              WHEN col_b IS NULL THEN col_a
              ELSE col_a || col_b
           END;
    

    이것은 더 빨리 열이 더 복잡해집니다. 또, 사용 CONCAT ()하지만 특별한 조건에 대한 검사를 추가 :

    SELECT CASE WHEN (col_a, col_b) IS NULL THEN NULL
                ELSE concat(col_a, col_b) END;
    

    어떻게 작동합니까? (col_a는 col_b) 연속 형 발현 ROW (col_a, col_b) 속기 표시법이다. 모든 열이 null의 경우 그리고 행 유형은 null입니다. 상해:

    또한, 사용 CONCAT_WS ()는 ( "분리기"에 대한 WS) 요소들 사이의 분리를 추가한다.

    케빈의 대답에 같은 식 :

    SELECT $1.zipcode || ' - ' || $1.city || ', ' || $1.state;
    

    PostgreSQL의 8.3 널 값을 준비 지루 (CONCAT없이 ()). 한 가지 방법 (많은)

    SELECT COALESCE(
             CASE
                WHEN $1.zipcode IS NULL THEN $1.city
                WHEN $1.city    IS NULL THEN $1.zipcode
                ELSE $1.zipcode || ' - ' || $1.city
             END, '')
           || COALESCE(', ' || $1.state, '');
    

    그들이 로케일 설정에 따라 달라 (timestamptz_out 같은) 데이터 형식 출력 기능을 호출 할 수 있기 때문에 CONCAT ()와 CONCAT_WS ()는 불변 안정 기능하지 않습니다. 톰 레인에 의해 설명.

    이 인덱스 표현식에서 자신의 직접 사용을 금지합니다. 당신은 결과가 귀하의 경우 실제로 불변 알고 있다면, 당신은 불변의 기능 래퍼로이 문제를 해결할 수 있습니다. 예 여기 :

  2. ==============================

    2.당신은 그런 식으로 참조하는 열을 저장 할 필요가 없습니다. 이 시도:

    당신은 그런 식으로 참조하는 열을 저장 할 필요가 없습니다. 이 시도:

    설정하기:

    CREATE TABLE tbl
      (zipcode text NOT NULL, city text NOT NULL, state text NOT NULL);
    INSERT INTO tbl VALUES ('10954', 'Nanuet', 'NY');
    

    우리는 우리가 "올바른 재료"가 볼 수 있습니다 :

    \pset border 2
    SELECT * FROM tbl;
    
    +---------+--------+-------+
    | zipcode |  city  | state |
    +---------+--------+-------+
    | 10954   | Nanuet | NY    |
    +---------+--------+-------+
    

    이제 유일한 매개 변수로 테이블의 레코드 형식을 취 원하는 "열 이름"으로 함수를 추가 :

    CREATE FUNCTION combined(rec tbl)
      RETURNS text
      LANGUAGE SQL
    AS $$
      SELECT $1.zipcode || ' - ' || $1.city || ', ' || $1.state;
    $$;
    

    긴 테이블 이름 또는 별명으로 다음과 같이 규정하고 있기 때문에 이는 그것이 표의 열 것처럼 사용할 수있는 함수를 작성

    SELECT *, tbl.combined FROM tbl;
    

    어떤이 같은 표시 :

    +---------+--------+-------+--------------------+
    | zipcode |  city  | state |      combined      |
    +---------+--------+-------+--------------------+
    | 10954   | Nanuet | NY    | 10954 - Nanuet, NY |
    +---------+--------+-------+--------------------+
    

    이 작품 때문에 하나가 발견되지 않으며, 식별자는 관계 이름이나 별명을 가진 자격을 갖춘 경우, 그것은 반환, 위의 같은 함수를 찾습니다, 그 인수로 행과 그것을 실행하지만, 실제 열의 첫번째 PostgreSQL의 확인, 결과 것처럼 컬럼이었다. 이렇게 할 경우 이러한 심지어 인덱스 "열을 발생"할 수 있습니다.

    당신은 중복 된 데이터를 각 행에 여분의 공간을 사용하여, 또는 모든 삽입 및 업데이트에 대한 트리거를 발사하지 않을 때문에이 종종 빠른 대안보다 수 있습니다.

  3. ==============================

    3.당신은 문자열 연결 기능을 확인 했습니까? 뭔가 같은 :

    당신은 문자열 연결 기능을 확인 했습니까? 뭔가 같은 :

    update table_c set column_a = column_b || column_c 
    

    작동합니다. 자세한 내용은 여기

  4. from https://stackoverflow.com/questions/12310986/combine-two-columns-and-add-into-one-new-column by cc-by-sa and MIT license