2013-03-01 61 views
21

我有此查詢:如果別人對WHERE子句

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

但我想要做這樣的事情:

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

如何檢查是否存在郵件?我想使用電子郵件,如果此字段爲空,我想使用email2。我該如何做到這一點?

回答

39

IF用來選擇字段,然後LIKE子句放置後:

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

第二次我喜歡你的回答最好 – botenvouwer 2013-03-01 16:46:10

+0

很高興我可以幫助:) – 2013-03-01 16:49:44

+0

我可以使用IF來過濾更多的領域?我想要做'if(active = 1)AND startDate 2014-07-18 14:21:00

6

你想用coalesce()

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

如果你想處理字符串( '')與NULL,一個工程案例:

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

而且,如果你擔心關於字符串真的只是空格:

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

另一方面,樣本if聲明確實在說「如果電子郵件以大於0的數字開頭」。這是因爲比較是0,一個數字。 MySQL隱式地嘗試將字符串轉換爲數字。因此,'[email protected]'會失敗,因爲字符串會轉換爲0.與'[email protected]'一樣。但是,'[email protected]'和'[email protected]'會成功。

+0

請問如果郵件是'這項工作'''而不是'NULL'? – mtahmed 2013-03-01 16:37:28

+0

@mtahmed不,它不會 - 我已經在我的答案中注意到了。問題不清楚什麼是正確的檢查。 – 2013-03-01 16:38:04

+0

@mtahmed否,'COALESCE'只能在NULL上工作。但列:電子郵件,電子郵件2是可以空的嗎? – 2013-03-01 16:38:54

2

請注意以下功能與Gordon Linoff的答案不同。他的回答假設你想要使用email2如果email是NULL。如果email是空字符串,Mine假定您想要使用email2。正確的答案將取決於您的數據庫(或者您可以執行NULL檢查空字符串檢查 - 這一切都取決於適合您的數據庫設計的內容)。

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

其實,'email是'而不是'LENGTH(email)= 0'嗎? – mtahmed 2013-03-01 16:40:43

+0

這對我有用,謝謝你的回答。請注意,我查找域名而不是電子郵件本身。這就是我使用LIKE %%的原因。 – botenvouwer 2013-03-01 16:41:05

+0

@mtahmed是的,這確實有用。我只是儘可能地複製了這個問題,所以我的回答對作者來說會更容易理解(儘管它肯定會是'email =''') – 2013-03-01 16:42:16

1

試試這個,希望它有助於

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