2016-07-10 10 views
1

Ich habe zwei Tabellen wie diese:Wie kann ich null ersetzen?

// 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   | 
+----+--------+------------+-----------+ 

hier ist auch meine Frage:

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-> ^^^^^^^^^^^^^^^^ 

Und hier ist das aktuellen Ergebnis:

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

Jetzt will ich setzen einige Standardwerte, wenn visibility <> 1 oder name or rep or avatar is null. Also hier ist die erwartet Ergebnis:

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

Wie kann ich das tun?


Hinweis: Ich kann das wie dies von PHP tun:

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

Aber ich möchte wissen, wie kann ich das durch reine SQL.

+0

Verwenden Sie einen Fall/wenn als eine Möglichkeit – Drew

Antwort

1

Sie können einfach COALESCE() verwenden:

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 

Sie können es auch mit IFNULL ersetzen. Der Unterschied zwischen ihnen ist, dass COALESCE() mehrere Argumente verarbeiten kann.

+0

Sie haben 'COALESCE' für jeden von ihnen separat verwendet. Ja, das ist richtig, und Sie können auch CASE WHEN verwenden. Aber ich denke, ich kann das mit nur einer Bedingung machen, denn wenn einer von ihnen null ist, dann sind alle null. –

+0

Das ist nicht wirklich wichtig. Ja, Sie können auch 'CASE EXPRESSION' verwenden, das etwas weniger lesbar ist. Sie können nicht 1 Bedingung für alle Spalten verwenden, jede Spalte wird separat berechnet, also müssen Sie die Bedingung jedes Mal setzen. Sie können 'CASE EXPRESSION' verwenden und jedes Mal dieselbe Spalte adressieren, aber es sind immer noch 3 Bedingungen. @MartinAJ – sagi

+0

Ah ok, danke, upvote –

Verwandte Themen