合并 2 选择语句为 1

Posted

技术标签:

【中文标题】合并 2 选择语句为 1【英文标题】:Amalgamate 2 select statements into 1 【发布时间】:2010-02-05 10:18:14 【问题描述】:

我目前有两个相当长的 select 语句,除了第一个是通过 count(*) 查看该行是否存在,第二个是根据 if 语句将行选择到 rowtype 变量之外这一点是相同的。这是因为数据需要进一步处理

我知道这是可能的,但我的大脑完全冻结了,谷歌返回了很多关于 select 和 if/else 的信息,但不是基于 select 的分支。

我尝试将 select 包装在 if 语句中但失败了,所以我想知道还有什么可以尝试的。

更新:伪示例:

select count(*) into num_items where <very long operation>;
if (num_items = 1) then
  begin
  select * into row_item where <very long operation>;
  end;
else
  dbms_output.put_line('failure');
end if;

另外:在一个稍微不相关的说明中,您如何让 dbms_output 立即刷新,以便您可以看到脚本当前的状态?目前它只在脚本结束后打印。

谢谢。

【问题讨论】:

【参考方案1】:

我想你想要的代码是这样的:

begin
  select * into row_item where <very long operation>;
exception
  when too_many_rows then
    dbms_output.put_line('failure');
end;

dbms_output 仅适用于开发代码时的调试,或用于从 SQL Plus 或 IDE 运行的 SQL 脚本。您可以使用自治事务将消息写入表;然后可以在程序仍在运行时由另一个会话读取这些内容。详情请见this question。

【讨论】:

【参考方案2】:

我想你想要SELECT CASE。

如果您需要更具体的帮助,请发布您当前的代码。

【讨论】:

这行不通,因为 case 语句在 select 内部。我需要检查select是否返回了rowdata类型的数据。 看来我不公平,不明白你在说什么。现在我已经阅读了更多内容,这是有可能的。【参考方案3】:

我会考虑这样的事情:

DECLARE
  CURSOR c IS
    SELECT COUNT(*) OVER () count_rows,
    q.* FROM (<very long operation>) q
    WHERE ROWNUM <= 2;
  r c%ROWTYPE;
BEGIN
  OPEN c;
  FETCH c INTO r;
  IF c%NOTFOUND OR r.count_rows != 1 THEN
    dbms_output.put_line('failure');
  ELSE
    --process the row
  END IF;
END;

这将从“非常长的操作”中最多计算 2 条记录;但只会获取第一行。如果只找到一行,r.count_rows 将为 1,如果找到多于 1 行,则为 2。这样可以避免执行两次长操作的双重打击。

【讨论】:

以上是关于合并 2 选择语句为 1的主要内容,如果未能解决你的问题,请参考以下文章

MySQL:将子选择和数组合并到一个IN语句中

如何将 2 个 select 语句合并为一个?

如何用sql语句将三张表合并为一张表

求助:SQLSERVER多条查询语句合并

动态合并数组的算法

我想编写从更新语句到合并合并语句的动态查询