2016-07-10 4 views
1

나는이 같은 두 개의 테이블이 있습니다null을 어떻게 대체 할 수 있습니까?

// users 
+----+--------+------------+----------------+------------+ 
| id | name | reputation |  avatar  | visibility | 
+----+--------+------------+----------------+------------+ 
| 1 | John | 344  | er0942334r4... | 1   | 
| 2 | Peter | 65544  | 340ojfc343f... | 0   | 
+----+--------+------------+----------------+------------+ 

// posts 
+----+--------+------------+-----------+ 
| id | title | content | author_id | 
+----+--------+------------+-----------+ 
| 1 | title1 | content1 | 2   | 
| 2 | title2 | content2 | 1   | 
+----+--------+------------+-----------+ 

또한 여기 내 쿼리입니다 :

SELECT p.*, u.name, u.reputation rep, u.avatar 
FROM posts p 
LEFT JOIN users u 
ON u.id = p.author_id AND u.visibility = 1 
// please focus on this-> ^^^^^^^^^^^^^^^^ 

그리고 여기 현재 결과입니다

+----+--------+------------+-----------+--------+------+----------------+ 
| id | title | content | author_id | name | rep |  avatar  | 
+----+--------+------------+-----------+--------+------+----------------+ 
| 1 | title1 | content1 | 2   |  |  |    | 
| 2 | title2 | content2 | 1   | John | 344 | er0942334r4... | 
+----+--------+------------+-----------+--------+------+----------------+ 

지금 내가 설정하려면 일부 기본값은 visibility <> 1 또는 name or rep or avatar is null입니다.

+----+--------+------------+-----------+--------+------+----------------+ 
| id | title | content | author_id | name | rep |  avatar  | 
+----+--------+------------+-----------+--------+------+----------------+ 
| 1 | title1 | content1 | 2   | NoName | 1 | default  | 
| 2 | title2 | content2 | 1   | John | 344 | er0942334r4... | 
+----+--------+------------+-----------+--------+------+----------------+ 

내가 어떻게 할 수 있습니다

: 그래서 여기 예상 결과?


참고 : 내가 이런 PHP로 그렇게 할 수 있습니다

$name = is_null($result['name']) ? 'NoName' : $result['name']; 
$name = is_null($result['rep']) ? 1   : $result['rep']; 
$name = is_null($result['avatar']) ? 'default' : $result['avatar']; 

하지만 내가 할 수있는 방법을 알고 싶어요 그 순수 SQL에 의해.

+0

편도로 케이스를 사용하십시오. – Drew

답변

1

당신은 단순히 COALESCE()를 사용할 수 있습니다

SELECT p.*, 
     COALESCE(u.name,'NoName') as `name`, 
     COALESCE(u.reputation,1) as rep, 
     COALESCE(u.avatar,'default') as avatar 
FROM posts p 
LEFT JOIN users u 
ON u.id = p.author_id AND u.visibility = 1 

또한 IFNULL로 교체 할 수 있습니다. 이들의 차이점은 COALESCE()이 여러 인수를 처리 할 수 ​​있다는 것입니다.

+0

각각에 대해 'COALESCE'를 사용했습니다. 네, 맞습니다. 또한 'CASE WHEN'도 사용할 수 있습니다. 하지만 그 중 하나가 null이면 모두 null입니다. 왜냐하면 나는 하나의 조건만으로 그 일을 할 수 있다고 생각합니다. –

+0

그건별로 중요하지 않습니다. 네, 조금 덜 읽을 수있는'CASE EXPRESSION'을 사용할 수도 있습니다. 모든 열에 대해 하나의 조건을 사용할 수 없으며 모든 열이 별도로 계산되므로 매번 조건을 입력해야합니다. 'CASE EXPRESSION'을 사용할 수 있고 매번 같은 컬럼을 처리 할 수 ​​있지만 여전히 3 가지 조건이 있습니다. @ MartinAJ – sagi

+0

아, 고마워, upvote –

관련 문제