왼쪽 외부 조인에 대한 기본값을 제공 할 수 있습니까?


21

테이블 a (열 a1 포함) 및 b (열 b1 및 b2 포함)가 있고 왼쪽 외부 조인을 수행한다고 가정합니다.

SELECT *
FROM a LEFT OUTER JOIN b
ON a.a1 = b.b1

그러면 b1과 b2는 NULL이되고 여기서 a1의 값은 b1과 일치하는 값이 없습니다.

NULL 대신 b2에 기본값을 제공 할 수 있습니까? a1과 일치하는 b1 값 있는 b2의 기본값이 잠재적 NULL을 무시 하지 않기 때문에 COALESCE는 여기서 작동 하지 않습니다 .

즉, a와 b를

CREATE TABLE a (a1)
  AS VALUES (1),
            (2),
            (3) ;

CREATE TABLE b (b1,b2)
  AS VALUES (1, 10),
            (3, null) ;


a1     b1 | b2
---    --------
 1      1 | 10
 2      3 | NULL
 3

b2의 기본값은 100입니다. 결과를 얻고 싶습니다.

a1 | b1   | b2
---------------
1  |  1   | 10
2  | NULL | 100
3  |  3   | NULL

이 간단한 경우에 출력에서 ​​b1이 NULL인지 여부를 확인하여 "수동으로"수행 할 수 있습니다. 이것이 일반적으로 최선의 선택입니까, 아니면 더 표준적이고 깔끔한 방법입니까?

답변:


23
SELECT a.a1,b.b1,  
    CASE WHEN b.b1 is NULL THEN 5 ELSE b.b2 END AS b2  
FROM a LEFT OUTER JOIN b  
ON a.a1 = b.b1

2
질문에 태그 만 지정된 경우 ANSI SQL을 사용하십시오 sql(이는 "SQL 쿼리 언어"를 의미합니다. 해당 태그는 특정 DBMS 제품 또는 방언을 나타내지 않습니다). 부분 [b2]=CASE WHEN ... END은 유효하지 않은 (표준) SQL 표현식입니다.
a_horse_with_no_name

Postgres 특정 답변을 수락 할 것임을 나타내는 태그를 추가했습니다. 여전히 가능한 경우 표준 SQL이 선호됩니다.
Tom Ellis

@Kin : 제 질문에 언급 된대로 "b1이 출력에서 ​​NULL인지 여부를 조사하여"수동으로 할 수 있습니다 ". 이것이 최선의 선택입니까, 아니면 더 표준적이고 깔끔한 방법입니까?"
Tom Ellis

3
JOIN으로 인해 발생하는 NULL과 "자연적으로"존재하는 NULL을 구분하려면 b1을 검사해야합니다. "네 손으로 할 수있다"라는 말이 맞다면, 그것이 유일한 방법입니다.
Mordechai

@MorDeror : 알겠습니다. "LEFT OUTER JOIN ... ON ... DEFAULT b2 = ..."와 같은 구문이있을 수 있습니다.
Tom Ellis

2

이 질문에 대한 원래의 대답은 설명 할 수 없었으므로 다시 한 번 봅시다.

CASE문장 사용

이 방법을 사용하면 다른 열에 다른 값이IS NOT NULL 있다는 것을 악용합니다 .이 경우 b.b1해당 값이 null이면 조인이 실패한 것입니다.

SELECT
  a.a1,
  b.b1,  
  CASE WHEN b.b1 is NULL THEN 100 ELSE b.b2 END AS b2  
FROM a
LEFT OUTER JOIN b  
  ON (a.a1 = b.b1);

이것은 완전히 작동하고 원하는 것을 정확하게 생성합니다.

하위 SELECT 사용

이 방법을 사용하지 마십시오. 빌드 아이디어입니다. 계속 읽으세요.

우리가 그렇게NOT NULL 활용할 수 있는 이 없다면 , 우리에게 그런 식으로 작동 할 수있는 열을 만들 무언가가 필요합니다 ...

SELECT
  a.a1,
  b.b1,  
  CASE WHEN b.cond IS NULL THEN 100 ELSE b.b2 END AS b2  
FROM a
LEFT OUTER JOIN (
  SELECT true AS cond, b.*
  FROM b
) AS b
  ON (a.a1 = b.b1);

행 비교 사용

우리가 비교할 수있는 잘못된 값을 강요하더라도 행을 비교하는 것이 더 쉽습니다. PostgreSQL에서 행은 테이블 이름으로 값을 갖습니다. 예를 들어 table에서 유형의 행 (행 유형)을 SELECT foo FROM foo반환 foo합니다 foo. 여기에서 ROW가 null인지 테스트합니다. 이것은 모든 열 만큼 작동 IS NOT NULL합니다. 그리고 만약 IS NULL당신의 테이블에 있는 모든 열 이 있다면 , 당신은 단지 트롤링입니다.

SELECT
  a.a1,
  b.b1,  
  CASE WHEN b IS NULL THEN 100 ELSE b.b2 END AS b2  
FROM a
LEFT OUTER JOIN b
  ON (a.a1 = b.b1);

솔루션에 b1사용 된 열 CASE은 널 입력 가능하지 않아도됩니다. 두 경우 모두 건설이 작동합니다.
ypercubeᵀᴹ

1

이 경우 COALESCE가 매우 유용하다는 것을 알았습니다. 목록에서 NULL이 아닌 첫 번째 값을 반환합니다.

SELECT
 a.a1,
 b.b1,
 COALESCE (b.b2, 100) AS b2
FROM a
LEFT OUTER JOIN b
  ON (a.a1 = b.b1);
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.