【问题标题】:If else on WHERE clauseIf else on WHERE 子句
【发布时间】:2013-03-01 16:32:59
【问题描述】:

我有这个查询:

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。我该如何做到这一点?

【问题讨论】:

    标签: mysql sql if-statement


    【解决方案1】:

    IF 用于选择字段,然后在其后放置LIKE 子句:

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

    【讨论】:

    • 第二次我最喜欢你的回答
    • 我可以使用 IF 过滤掉更多的字段吗?我想做if (active = 1) AND startDate < UNIX_TIMESTAMP()。有这样的可能吗?
    • @TomHart: IF 这里仅用于选择一个字段与另一个字段。在您的示例中没有任何意义。你的意思是:WHERE active=1 AND startDate < UNIX_TIMESTAMP()
    • 不完全是,我只希望它检查活动的开始日期是否为 1。
    • @TomHart:WHERE active=1 AND startDate < UNIX_TIMESTAMP()。我很确定如果active 不是 1,MySQL 会短路并停止评估。
    【解决方案2】:

    你想使用coalesce():

    where coalesce(email, email2) like '%anja@fiskkoer.nl%'
    

    如果你想处理 empty 字符串 ('') 与 NULL,一个案例可行:

    where (case when email is NULL or email = '' then email2 else email end) like '%anja@fiskkoer.nl%'
    

    而且,如果您担心字符串实际上只是空格:

    where (case when email is NULL or ltrim(email) = '' then email2 else email end) like '%anja@fiskkoer.nl%'
    

    顺便说一句,示例 if 语句实际上是在说“如果电子邮件以大于 0 的数字开头”。这是因为比较的是 0,一个数字。 MySQL 隐式尝试将字符串转换为数字。因此,'abcd@de.com' 会失败,因为字符串会转换为 0。'0abc@de.com' 也会如此。但是,'1abc@de.com' 和 '01abc@de.com' 会成功。

    【讨论】:

    • @mtahmed 不,不会 - 我在回答中已经注意到了。这个问题不清楚什么是正确的检查。
    • @mtahmed 否,COALESCE 仅适用于 NULL。但是列:email, email2 可以为空吗?
    • 如果你喜欢,字段或表格单元格只是 '' 而不是 NULL,所以你去。 ps,数据库本身不是我做的!
    【解决方案3】:

    请注意,以下内容在功能上与 Gordon Linoff 的回答不同。他的回答假设如果email 为NULL,您想使用email2。如果email 是一个空字符串,我假设你想使用email2。正确答案取决于您的数据库(或者您可以执行 NULL 检查空字符串检查 - 这完全取决于适合您的数据库设计的内容)。

    SELECT  `id` ,  `naam` 
    FROM  `klanten` 
    WHERE `email` LIKE  '%anja@fiskkoer.nl%'
    OR (LENGTH(email) = 0 AND `email2` LIKE  '%anja@fiskkoer.nl%')
    

    【讨论】:

    • 实际上,email IS '' 可以代替LENGTH(email) = 0 工作吗?
    • 这对我有用,谢谢你的回答。请注意,我查找的是域而不是电子邮件本身。这就是我使用 LIKE %% 的原因。
    • @mtahmed 是的,确实有效。我只是尽可能地复制这个问题,所以我的回答对作者来说会更容易理解(尽管肯定是email = ''?)
    • 我问的原因是因为在检查空字符串时,进行字符串比较(email = '')而不是检查长度(LENGTH(email) = 0)几乎总是更好,因为进行字符串比较更快.
    • @mtahmed 。 . .你有关于为什么字符串比较比长度快的参考吗?鉴于长度存储在字符串中的任何数据之前,我希望长度比较可能会更快。 (dev.mysql.com/doc/refman/5.5/en/char.html)
    【解决方案4】:

    试试这个,希望对你有帮助

    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
    

    【讨论】:

      【解决方案5】:

      这里是一个表的示例查询,该表与具有查询参数的同一个表具有外键关系。

      SET @x = -1;
      SELECT id, categoryName 
      FROM Catergory WHERE IF(@x > 0,category_ParentId = @x,category_ParentId IS NOT NULL);
      

      @x 可以更改。

      【讨论】:

        猜你喜欢
        • 2013-03-18
        • 2020-12-13
        • 2016-09-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-08-09
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多