MySQL - 查询条件,仅在另一个查询条件不返回结果时触发

时间:2017-11-08 10:17:46

标签: mysql mariadb

是否有可能在MySQL中添加一个WHERE条件,只有在前面的where条件没有返回结果的情况下,才会触发两个连续的查询?

所以,基本上我正在寻找的是:

请考虑下表:Currencies

| CurrencyId | CurrencyCode | CurrencyName         |
----------------------------------------------------
| 1          | EUR          | Euro                 |
| 2          | USD          | United States Dollar |
| 3          | GBP          | Great Brittain Pond  |
| 4          | RON          | Romanian New Lei     |
----------------------------------------------------

考虑以下问题:

SELECT * FROM Currencies WHERE (CurrencyCode LIKE '%RO%' OR CurrencyName LIKE '%RO%') AND CurrencyId <= 4

此查询将返回第1行(Euro包含&#39; ro&#39;)和第4行(RON包含&#39; RO&#39;)。我想要实现的是编写一个查询,它首先只运行第一个LIKE语句,如果有结果,它会忽略第二个LIKE语句,否则,它会尝试第二个LIKE语句。在这两种情况下,查询都应该运行其他条件。所以基本上,上面的查询,如果重写,应该只返回第4行。

这在MySQL中是否有可能?

1 个答案:

答案 0 :(得分:1)

获取两行,然后选择首选行:

SELECT ...
    FROM ...
    WHERE ( ... LIKE ... OR ... LIKE ... )
      AND ...
    ORDER BY CurrencyCode LIKE '%RO%' DESC
    LIMIT 1;

LIKE返回true / false,可以将其视为1/0,因此DESC

如果有多个匹配代码,它们将首先返回,但没有特定的顺序。

如果您想优先考虑代码名称匹配的行,那么

    ORDER BY CurrencyCode LIKE '%RO%' DESC,
             CurrencyName LIKE '%RO%' DESC

(另请参阅CASE ...了解相关信息。)

<强>修饰

基于新规范...

( SELECT ... WHERE CurrencyCode LIKE ... )
UNION ALL
( SELECT ... WHERE CurrencyName LIKE ...
               AND NOT EXISTS ( SELECT 1
                        WHERE CurrencyCode LIKE ... ) )

第一个SELECT将获得所有匹配的代码(如果有的话) 如果存在任何匹配的代码,则第二个SELECT将失败,否则将提供匹配的名称。

您可以在每个ORDER BY或最后添加SELECT