2013-03-01 8 views
21

Ich habe diese Anfrage:Wenn sonst auf dem WHERE-Klausel

SELECT `id` , `naam` 
FROM `klanten` 
WHERE (
`email` LIKE '%@domain.nl%' 
OR `email2` LIKE '%@domain.nl%' 
) 

Aber ich will, so etwas tun:

SELECT `id` , `naam` 
FROM `klanten` 
WHERE IF(`email` > 0, 
`email` LIKE '%@domain.nl%' 
, `email2` LIKE '%@domain.nl%' 
) 

Wie überprüfen, ob E-Mail gibt es? Ich möchte E-Mail verwenden und wenn dieses Feld leer ist, möchte ich E-Mail2 verwenden. Wie erreiche ich das?

Antwort

39

IF wird verwendet, um das Feld auszuwählen, dann die LIKE Klausel, nachdem er platziert wird:

SELECT `id` , `naam` 
FROM `klanten` 
WHERE IF(`email` != '', `email`, `email2`) LIKE '%@domain.nl%' 
+0

Am zweiten Tag mochte ich deine Antwort am besten – botenvouwer

+0

Froh kann ich helfen :) –

+0

Kann ich IF verwenden, um mehr Felder herauszufiltern? Ich möchte tun, wenn (aktiv = 1) UND startDate

6

Sie wollen coalesce() verwenden:

where coalesce(email, email2) like '%[email protected]%' 

Wenn Sie leer Strings ('') im Vergleich zu NULL zu handhaben wollen, ist ein Fall funktioniert:

where (case when email is NULL or email = '' then email2 else email end) like '%[email protected]%' 

Und, wenn Sie besorgt sind, über die Zeichenfolge wirklich nur Leerzeichen:

where (case when email is NULL or ltrim(email) = '' then email2 else email end) like '%[email protected]%' 

Als Nebenbemerkung lautet die Anweisung if wirklich "Wenn die E-Mail mit einer Zahl größer als 0 beginnt". Dies liegt daran, dass der Vergleich zu 0 eine Zahl ist. MySQL versucht implizit, die Zeichenfolge in eine Zahl zu konvertieren. "[email protected]" würde also fehlschlagen, weil die Zeichenkette als 0 konvertiert würde. Wie auch "[email protected]". Aber "[email protected]" und "[email protected]" würden Erfolg haben.

+0

hilft Wird diese Arbeit, wenn E-Mail ist ' "" statt "NULL"? – mtahmed

+0

@mtahmed Nein, wird es nicht - das habe ich in meiner Antwort bemerkt. Die Frage ist nicht klar, was die richtige Überprüfung wäre. –

+0

@mtahmed nein, 'COALESCE' funktioniert nur mit' NULL'. Aber Spalten: E-Mail, E-Mail2 sind NULL zulässig, oder? –

2

Beachten Sie das folgende ist funktionell anders als die Antwort von Gordon Linoff. Seine Antwort geht davon aus, dass Sie email2 verwenden möchten, wenn email NULL ist. Meine nimmt an, dass Sie email2 verwenden möchten, wenn email eine leere Zeichenfolge ist. Die richtige Antwort hängt von Ihrer Datenbank ab (oder Sie können eine Null-Überprüfung durchführen und eine leere Zeichenfolge überprüfen - es hängt alles davon ab, was für Ihr Datenbank-Design geeignet ist).

SELECT `id` , `naam` 
FROM `klanten` 
WHERE `email` LIKE '%[email protected]%' 
OR (LENGTH(email) = 0 AND `email2` LIKE '%[email protected]%') 
+0

Funktioniert "email" tatsächlich "anstatt" LENGTH (email) = 0 "? – mtahmed

+0

das funktioniert für mich danke für dich antwort. Beachten Sie, dass ich nach der Domäne und nicht nach der E-Mail selbst suche. Deshalb benutze ich LIKE %%. – botenvouwer

+0

@mtahmed Ja, das funktioniert. Ich kopierte die Frage so genau wie möglich, so dass meine Antwort für den Autor verständlicher wäre (obwohl es "email = '' sicher" wäre). –

1

dies versuchen, hoffen, dass es

select user_display_image as user_image, 
user_display_name as user_name, 
invitee_phone, 
(
CASE 
    WHEN invitee_status=1 THEN "attending" 
    WHEN invitee_status=2 THEN "unsure" 
    WHEN invitee_status=3 THEN "declined" 
    WHEN invitee_status=0 THEN "notreviwed" END 
) AS invitee_status 
FROM your_tbl