Postgres SELECT에서 열을 연결하는 방법은 무엇입니까?


145

나는 두 개의 문자열 열이 ab테이블에 foo.

select a, b from foo값 반환 ab. 그러나 연결 ab작동하지 않습니다. 나는 시도했다 :

select a || b from foo

select  a||', '||b from foo

주석에서 업데이트 : 두 열 모두 유형 character(2)입니다.


아니면 다른 text유형입니까?
PM 77-1

@acfrancis OP는 concatenatePostgreSQL이 숫자 유형을 처리하지만 숫자 유형을 다루고 있다고 의심합니다. 다음을 참조하십시오 : postgresql.org/docs/9.1/static/functions-string.html
PM 77-1

예,이 열은 문자 (2)입니다. "+"가 작동하지 않습니다- "지정된 이름 및 인수 유형과 일치하는 연산자가 없습니다. 명시 적 유형 캐스트를 추가해야 할 수도 있습니다."
Alex

PostgreSQL의 버전은 무엇입니까? 다음은 9.1 관련 문서입니다 : postgresql.org/docs/9.1/static/functions-string.html . 내 예를 참조하십시오 : sqlfiddle.com/#!15/d41d8/182
PM 77-1

연결과 관련이없는 쿼리에 구문 오류가있을 수 있습니다.
PM 77-1

답변:


260

(나중에 언급했듯이) 문자열 유형 열을 사용 character(2)하면 표시된 연결 이 매뉴얼을 인용 하기 때문에 작동합니다 .

[...] 문자열 연결 연산자 ( ||)는 표 9.8에 표시된 것처럼 하나 이상의 입력이 문자열 유형 인 경우 문자열이 아닌 입력을 허용 합니다. 다른 경우에는 [...]text

대담한 강조 광산. 두 번째 예제 ( select a||', '||b from foo)는 형식이 지정되지 않은 문자열 리터럴이 기본적으로 모든 경우에 전체 식을 유효하게 만드는 형식이므로 모든 데이터 형식에 적용됩니다.', 'text

문자열이 아닌 데이터 형식의 경우 하나 이상의 인수를 로 캐스팅 하여 첫 번째 문을 "수정"할 수 있습니다 text. ( 모든 유형은로 캐스팅 가능 text) :

SELECT a::text || b AS ab FROM foo;

자신의 답변으로 판단 하면 " 작동하지 않습니다 "는 " NULL을 반환합니다 " 를 의미하는 것으로 간주되었습니다 . NULL에 연결된 모든 결과 는 NULL입니다. 경우 NULL의 값이 참여 할 수 있으며, 결과는 NULL을지지 않습니다, 사용 concat_ws()가치 (나중에 포스트 그레스 9.1)의 수를 연결하는 :

SELECT concat_ws(', ', a, b) AS ab FROM foo;

또는 concat()구분 기호가 필요하지 않은 경우 :

SELECT concat(a, b) AS ab FROM foo;

두 함수 모두 "any"입력을 받고 텍스트 표현으로 작업하기 때문에 타입 캐스트가 필요하지 않습니다 .

COALESCE이 관련 답변에 대한 자세한 내용 (그리고 왜 대체가 좋지 않은지 ) :

코멘트의 갱신에 대해

+Postgres (또는 표준 SQL)에서 문자열 연결에 유효한 연산자가 아닙니다. 이를 제품에 추가하는 것은 Microsoft의 사적인 아이디어입니다.

사용해야 할 이유가 거의 없습니다 character(n)(동의어 :) char(n). text또는을varchar 사용하십시오 . 세부:


감사합니다. 첫 번째 버전은 null로 작동하지 않으며 두 번째 버전에서는 concat_ws에 대한 오류가 발생했습니다. 주어진 이름 및 인수 유형과 일치하는 함수가 없습니다. 명시 적 유형 캐스트를 추가해야 할 수도 있습니다.
Alex

1
당신은 봤어요 Postgres 9.1 or later? 질문에서 Postgres 버전을 제공해야합니다 . 하시기 바랍니다 귀하의 질문을 업데이트 하면 다른 용도로 돌아 오기 전에, 모든 요청한 정보.
Erwin Brandstetter

감사합니다. 제가 찾은 솔루션은 모든 Postgres 버전에서 작동합니다
Alex

SELECT concat(a, b) FROM foo;포스트 그레스 9.3에서 나를 위해 작동 a하고 b있는 VARCHAR의.
elimisteve

답변 주셔서 감사합니다, 내 문제가 해결되었습니다 :).
ashwaqar

33

문제는 값에서 널 (NULL)로 설정되었습니다. 연결은 널과 함께 작동하지 않습니다. 해결책은 다음과 같습니다.

SELECT coalesce(a, '') || coalesce(b, '') FROM foo;

18

연결을 위해 PostgreSQL에서 CONCAT 함수를 사용하는 것이 좋습니다

예 : select CONCAT(first_name,last_name) from person where pid = 136

column_a를 사용하는 경우 || ''|| column_a 또는 column_b의 값 중 하나가 null이면 query는 null 값을 반환합니다. 모든 경우에 바람직하지 않을 수도 있습니다.

||

사용하다

CONCAT

둘 중 하나라도 가치가 있으면 관련 가치를 돌려줍니다


7

CONCAT 함수는 때때로 이전 postgreSQL 버전에서 작동하지 않습니다

CONCAT를 사용하지 않고 문제를 해결하는 데 사용한 것을 확인하십시오.

 u.first_name || ' ' || u.last_name as user,

또는 당신은 사용할 수 있습니다

 "first_name" || ' ' || "last_name" as user,

두 번째 경우에는 first_name 및 last_name에 큰 따옴표를 사용했습니다.

도움이 되길 바랍니다. 감사합니다.


1
내 이름 또는 성이 null 인 경우 concat 값도 null을 표시합니다
Lokesh

2

나는 또한 이것에 갇혀 있었으므로 나에게 가장 적합한 솔루션을 공유해야한다고 생각합니다. 또한 이것이 훨씬 간단하다고 생각합니다.

대문자 테이블 이름을 사용하는 경우

SELECT CONCAT("firstName", ' ', "lastName") FROM "User"

소문자 테이블 이름을 사용하는 경우

SELECT CONCAT(firstName, ' ', lastName) FROM user

그게 다야!. PGSQL은 열 선언에 대해 Double Quote와 문자열에 대해 Single Quote를 계산하므로 매력처럼 작동합니다.


1

PHP의 라 라벨 프레임 워크, 검색 first_name을 사용하고 있으며 last_name 필드는 전체 이름 검색과 같습니다.

|| 사용 기호 또는 concat_ws (), concat () 메소드

$names = str_replace(" ", "", $searchKey);                               
$customers = Customer::where('organization_id',$this->user->organization_id)
             ->where(function ($q) use ($searchKey, $names) {
                 $q->orWhere('phone_number', 'ilike', "%{$searchKey}%"); 
                 $q->orWhere('email', 'ilike', "%{$searchKey}%");
                 $q->orWhereRaw('(first_name || last_name) LIKE ? ', '%' . $names. '%');
    })->orderBy('created_at','desc')->paginate(20);

이것은 매력적이었다 !!!



-1

예를 들어 다음과 같이 열로 구성된 직원 테이블이있는 경우 :

employee_number,f_name,l_name,email_id,phone_number 

우리는 연결하는 원하는 경우 f_name + l_namename.

SELECT employee_number,f_name ::TEXT ||','|| l_name::TEXT  AS "NAME",email_id,phone_number,designation FROM EMPLOYEE;

이 답변은 기존 답변보다 무엇을 추가합니까?
Erwin Brandstetter
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.