【问题标题】:Is it possible to choose between two different SELECT statements in MySQL?是否可以在 MySQL 中的两个不同的 SELECT 语句之间进行选择?
【发布时间】:2020-12-19 07:39:23
【问题描述】:

我有一个存储过程,它连接许多不同的表并返回 1 行。我不太确定这个过程的工作原理,但我认为这在这里不太重要。

我遇到的问题是,根据许多不同的事情,这个过程有时可能会返回一个空行(没有结果),如果发生这种情况,我们可以简单地在过程中进行一些更改强迫它指向另一张桌子,一切都很好。问题是我想自动执行此操作,虽然我知道可以在应用程序端执行此操作(通过有两个单独的存储过程并调用一个,如果没有结果,则调用另一个)但我会宁可避免这种情况,所以:

是否可以在 MySQL 中调用一个 SELECT 语句并根据结果返回该结果或调用稍微不同的 SELECT 语句,理想情况下是在一个存储过程中?

类似

IF (SELECT something FROM somewhere) = '1 row'
THEN 
     # 1 row returned so all good.
     SELECT something FROM somewhere
ELSE
     # 0 rows returned so do this one instead.
     SELECT somethingElse FROM somewhereElse

提前谢谢...

【问题讨论】:

  • .见 COALESCE()
  • 显示你的存储过程
  • @Strawberry 我曾考虑过这一点,但这不是只需要 SELECT 语句返回 1 列吗?因此,例如,以下内容将不起作用;选择合并((选择 * FROM faults WHERE fault_id = 2),(选择 * FROM faults WHERE fault_id = 131));因为每个 SELECT 语句返回多于一列。在我上面编写的示例中,fault_id 2 不存在。
  • 我有一个存储过程,它连接许多不同的表并返回 1 行。 这是否意味着“1 行或 0 行”或“1 行或非 1 (0, 2, 3, ...) 行”?如果首先 - 您的 SP 输出查询是否包含明确的 LIMIT 1?

标签: mysql sql stored-procedures count where-clause


【解决方案1】:

是的,这就是程序允许您执行的操作(=添加逻辑)。例如,您可以为此使用临时表:

drop temporary table if exists result_tmp;

create temporary table result_tmp
select something from somewhere;

if (row_count()>0) then
  select * from result_tmp;
else
  select somethingelse from somewhereelse;
end if;

【讨论】:

    【解决方案2】:

    您可以在带有union all 和not exists 的单个select 语句中执行此操作:

    select something from somewhere
    union all
    select somethingElse from somewhereElse where not exists (select something from somewhere)
    

    not exists 条件阻止 union all 的第二个成员在第一个成员产生至少一行时返回某些内容。

    【讨论】:

    • 这看起来很有趣,我自己一直在和 UNION 调情,订购然后限制结果。如果我的两个 SELECTS 都有自己的 WHERE,这将如何工作?将以下作为非常基本的示例? 'SELECT * FROM faults WHERE fault_id =50 # 这不存在。 UNION ALL SELECT * FROM faults WHERE fault_id =131 # 这确实存在,所以 WHERE 不存在 (SELECT * FROM faults WHERE fault_id =50)'
    • 它似乎不喜欢我假设的 WHERE NOT EXISTS 的 WHERE 部分,因为我已经有一个 WHERE 在第二个 SELECT 语句中。
    • 我最终简化为 SELECT blah, blah, UNION SELECT blah, blah LIMIT 1。一个非常简化的解决方案,我尚未将其作为庞大过程的一部分进行检查,但原则上,它看起来好像可以工作,因为它将结果限制为 1 行并使用它。同时感谢您的指点;)
    • @plisken:这是你想要的吗? SELECT * FROM faults WHERE fault_id =50 UNION ALL SELECT * FROM faults WHERE fault_id =131 AND WHERE NOT EXISTS (SELECT * FROM faults WHERE fault_id =50) 请注意,如果union all 的两个成员都与同一个表相关,那么有更好的解决方案union all(在你的问题中,你有from somewhere 和from somewereElese,所以它看起来像两个不同的表) .
    猜你喜欢
    • 1970-01-01
    • 2013-01-29
    • 2011-05-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多