如何在 SQL 查询中仅检查从存储过程返回的行的第一个值

Posted

技术标签:

【中文标题】如何在 SQL 查询中仅检查从存储过程返回的行的第一个值【英文标题】:How to check only the first value of the row returned from stored procedure in a SQL query 【发布时间】:2017-05-10 12:01:13 【问题描述】:

如果我有这样的存储过程:

get_my_dep(empNum)

它返回一行,例如:

call get_my_dep(567);


dep_code  dep_year  dep_name
66        2017       HR

如何在查询中只检查行的第一个值 (dep_code),如下所示:

SELECT * 
FROM rmcandidate a INNER JOIN task b
ON a.task_code = b.task_code
WHERE get_my_dep(emp_num) != 0 -- here I want to check only the dep_code
AND b.active_flag = 1

【问题讨论】:

【参考方案1】:

大概存储过程被定义为返回多个值,如下所示:

create procedure get_my_dep(emp_num int)
returning int as dep_code, int as dep_year, char(8) as dep_name;

在这种情况下,您可以创建一个仅返回一个值的包装过程,然后在 WHERE 子句中使用它。例如:

create procedure get_my_dep_code(emp_num int)
returning int as dep_code;
define dc, dy int;
define dn char(8);
execute procedure get_my_dep(emp_num) into dc, dy, dn;
return dc;
end procedure;

另一种方法是定义返回行类型的过程。例如:

create row type dep_code_t(dep_code int, dep_year int, dep_name char(8));
create procedure get_my_dep(emp_num int)
returning dep_code_t;
define dc, dy int;
define dn char(8);
...
return row(dc, dy, dn)::dep_code_t;
end procedure;

然后可以在 WHERE 子句中直接引用返回的行类型的元素,如下所示:

WHERE get_my_dep(emp_num).dep_code != 0

【讨论】:

加一个返回行:D【参考方案2】:

您可以尝试使用虚拟表:

SELECT 
    * 
FROM 
    rmcandidate AS a 
    INNER JOIN task AS b
    ON 
        a.task_code = b.task_code
WHERE 
    b.active_flag = 1
    AND 0 != 
    (
        SELECT 
            vt1.dep_code 
        FROM 
            TABLE (get_my_dep(emp_num)) AS vt1 (dep_code, dep_year, dep_name)
    )
;

这是在 Informix 12.10 上测试的。

【讨论】:

以上是关于如何在 SQL 查询中仅检查从存储过程返回的行的第一个值的主要内容,如果未能解决你的问题,请参考以下文章

在 MySQL 中仅检索固定数量的行

在提取数据库中重复行的查询结果中仅选择较新的记录

MySQL - 一对多连接 - 从“一个”表中仅返回 1 行的结果

MYSQL的存储过程如何返回查询到的行数据?

如何从 T-SQL 存储过程返回表

如何从返回多个 OUT 值的过程中仅访问一个 OUT 值?