[SQL] 두 개의 열을 결합하여 하나 개의 새로운 컬럼에 추가
SQL두 개의 열을 결합하여 하나 개의 새로운 컬럼에 추가
PostgreSQL을, 나는 두 개의 열을 결합하고 그들로부터 새 열을 생성하는 SQL 문을 사용하려고합니다.
나는 (...) CONCAT를 사용하는 방법에 대해 생각하고 있어요,하지만 더 좋은 방법은 무엇입니까? 이 작업을 수행하는 가장 좋은 방법은 무엇입니까?
해결법
-
==============================
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.당신은 그런 식으로 참조하는 열을 저장 할 필요가 없습니다. 이 시도:
당신은 그런 식으로 참조하는 열을 저장 할 필요가 없습니다. 이 시도:
설정하기:
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.당신은 문자열 연결 기능을 확인 했습니까? 뭔가 같은 :
당신은 문자열 연결 기능을 확인 했습니까? 뭔가 같은 :
update table_c set column_a = column_b || column_c
작동합니다. 자세한 내용은 여기
from https://stackoverflow.com/questions/12310986/combine-two-columns-and-add-into-one-new-column by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] X 일 연속 확인 - 데이터베이스에 주어진 타임 스탬프를 (0) | 2020.04.19 |
---|---|
[SQL] 연루되는 테이블에서 선택하는 단일 쿼리에서 여러 테이블에 INSERT 행 (0) | 2020.04.19 |
[SQL] C #을 GUID 및 SQL의 고유 식별자 (0) | 2020.04.19 |
[SQL] 트랜잭션 내에서 "GO"를 사용하여 (0) | 2020.04.19 |
[SQL] SQL Server의 문자열을 varbinary (0) | 2020.04.19 |