case语句与比较

o7jaxewo  于 2021-06-20  发布在  Mysql
关注(0)|答案(1)|浏览(402)

在下面的现有语句中,我将主机名和ip地址与从另一个表中检索到的记录进行比较,并在找到该列时将其标记为true,但当主机名也是检索到的记录的identifer的一部分时(即

host_name=abc
identifier=abc.google.com should also be true

CASE
    WHEN
        (
            (`inv_y`.`host_name` <> '')
            AND
            `inv_y`.`host_name` IN (SELECT `inv_x`.`identifier`
                                      FROM `inv_x`
                                  ORDER BY `inv_x`.`creation_date` DESC
                                   )
        )
        OR
        (
            (`inv_y`.`ip_address` <> '')
            AND
            inv_y`.`ip_address` IN (SELECT `inv_x`.`identifier`
                                      FROM `inv_x`
                                  ORDER BY `inv_x`.`creation_date` DESC
                                   )
        )
    THEN
        'True'
    ELSE
        'False'
END
y3bcpkx1

y3bcpkx11#

看来你可以从中受益 EXISTS 功能。类似以下的方法可能会起作用:

SELECT CASE WHEN EXISTS(SELECT 1 
          FROM inv_y 
          WHERE (ip IN (SELECT identifier 
                       FROM inv_x)
          OR hostname IN (SELECT identifier 
                       FROM inv_x))
          AND hostname LIKE '%eb%'
         ) = 1 THEN "True"
  ELSE "False"
END AS Present;

下面是一个演示:sqlfiddle
请注意,如果可以使用1或0而不是true或false,则可以进一步简化上述内容。 EXISTS 如果找到行,则返回1;如果没有,则返回0,并且 CASE 是否有简单的方法将其转换为“真”或“假”,因此您可以简单地获得以下信息:

SELECT EXISTS(SELECT 1 
              FROM inv_y 
              WHERE (ip IN (SELECT identifier 
                            FROM inv_x)
                OR hostname IN (SELECT identifier 
                                FROM inv_x)
              )
              AND hostname LIKE '%eb%') AS Present;

相关问题