mysql 如果第一个查询没有结果,如何回退到第二个查询?

idfiyjo8  于 2023-02-15  发布在  Mysql
关注(0)|答案(2)|浏览(368)

我有一个Select语句A。如果它没有产生结果,我希望使用Select B的结果。如果您愿意,Select B是Select A的"后备"。
选择A:

SELECT b FROM table_with_name WHERE a = 1

选择B:

SELECT b FROM other_table_with_name WHERE a = '-8'

通常我会使用'OR',但是由于语句依赖于完全不同的表,这似乎是不可能的。我该怎么做呢?

    • 示例:**

具有名称的表

+---+-----+
| a | b   |
+---+-----+
| 1 | abc |
+---+-----+
| 2 | def |
+---+-----+
| 3 | ghi |
+---+-----+

具有名称的其他表

+----+-----+
| a  | b   |
+----+-----+
| -8 | xyz |
+----+-----+
| 7  | mno |
+----+-----+
| 11 | tuv |
+----+-----+
    • 想要的结果**
+-----+
| abc |
+-----+

如果要删除该条目,则需要以下(回退)结果:

+-----+
| xyz |
+-----+
tpgth1q7

tpgth1q71#

执行UNION ALL。如果第一个SELECT返回非空结果,则任务完成。否则返回第二个SELECT的结果:

SELECT a FROM table_with_name WHERE a = 1
UNION ALL
SELECT b FROM other_table_with_name
WHERE b = 'xyz'
  AND NOT EXISTS (SELECT a FROM table_with_name WHERE a = 1)
tag5nh1u

tag5nh1u2#

如果有多个结果(* 子查询返回超过1行 *),此解决方案将引发错误。
使用CASE可以完成以下操作:

SELECT 
    CASE 
        WHEN EXISTS (SELECT b FROM table_with_name WHERE a = 1)
            THEN (SELECT b FROM table_with_name WHERE a = 1)
            ELSE (SELECT b FROM other_table_with_name WHERE a = '-8')
    END AS your_result

如果找到第一条语句的结果,则使用该结果。如果没有,则执行ELSE部分中的查询。

相关问题