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

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

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

select a || b from foo

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

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



답변

(나중에 언급했듯이) 문자열 유형 열을 사용 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)로 설정되었습니다. 연결은 널과 함께 작동하지 않습니다. 해결책은 다음과 같습니다.

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


답변

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

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

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

||

사용하다

CONCAT

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


답변

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

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

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

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

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

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

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


답변

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

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

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

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

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

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


답변

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);

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


답변

이 시도

select textcat(textcat(FirstName,' '),LastName) AS Name from person;