2013-03-01 10 views
21

mam tej kwerendy:Jeśli indziej na WHERE

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

Ale chcę zrobić coś takiego:

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

Jak sprawdzić, czy adres e-mail istnieje? Chcę korzystać z poczty e-mail, a jeśli to pole jest puste, chcę użyć adresu e-mail2. Jak to zrobić?

Odpowiedz

39

IF jest używany, aby wybrać pole, wówczas klauzula LIKE umieszcza się po nim:

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

Po drugiej próbie podoba mi się twoja odpowiedź najlepsza – botenvouwer

+0

Cieszę się, że mogę pomóc :) –

+0

Czy mogę użyć IF, aby odfiltrować więcej pól? Chcę zrobić 'if (active = 1) AND startDate

6

Chcesz użyć coalesce():

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

Jeśli chcesz obsługiwać pustych ciągi ('') w porównaniu NULL, sprawa działa:

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

A jeśli obawiasz o łańcuchu rzeczywiście będącym po prostu spacji:

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

Na marginesie, przykładowe stwierdzenie if mówi "Jeśli e-mail zaczyna się od liczby większej niż 0". Wynika to z tego, że porównanie ma wartość 0, liczbę. MySQL niejawnie próbuje przekonwertować ciąg na liczbę. Tak więc "[email protected]" zawiedzie, ponieważ ciąg znaków będzie konwertowany jako 0. Podobnie jak "[email protected]". Ale "[email protected]" i "[email protected]" się powiodą.

+0

Czy to zadziała, czy e-mail jest ' "" zamiast "NULL"? – mtahmed

+0

@mtahmed Nie, nie będzie - zauważyłem to w mojej odpowiedzi. Pytanie nie jest jasne, na czym polega prawidłowa kontrola. –

+0

@mtahmed nie, 'COALESCE' działa tylko na' NULL'. Ale kolumny: email, email2 są zerowe, prawda? –

2

Uwaga: poniższe działanie różni się funkcjonalnie od odpowiedzi Gordona Linoffa. Jego odpowiedź zakłada, że ​​chcesz użyć email2, jeśli email ma wartość NULL. Mój zakłada, że ​​chcesz użyć email2, jeśli email jest pustym łańcuchem. Prawidłowa odpowiedź będzie zależeć od bazy danych (lub możesz wykonać NULL check i czek pusty ciąg - wszystko zależy od tego, co jest odpowiednie dla projektu bazy danych).

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

Czy rzeczywiście 'email IS '' 'działa zamiast' LENGTH (email) = 0'? – mtahmed

+0

to działa dla mnie dziękuję za odpowiedź. Zwróć uwagę, że szukam domeny, a nie samej wiadomości e-mail. Dlatego używam LIKE %%. – botenvouwer

+0

@mtahmed Tak, to działa. Właśnie kopiowałem to pytanie tak blisko, jak to możliwe, więc moja odpowiedź byłaby bardziej zrozumiała dla autora (chociaż byłaby to 'email = ''' z pewnością?) –

1

spróbować tego, mam nadzieję, że pomaga

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