如何仅检查 SQL 查询中从存储过程返回的行的第一个值
How to check only the first value of the row returned from stored procedure in a SQL query
如果我有这样的存储过程:
get_my_dep(empNum)
它 returns 一行 例如:
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
大概存储过程被定义为 returning 多个值,如:
create procedure get_my_dep(emp_num int)
returning int as dep_code, int as dep_year, char(8) as dep_name;
在这种情况下,您可以创建一个 return 仅包含其中一个值的包装过程,然后在 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;
另一种方法是将过程定义为 return 行类型。例如:
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 子句中直接引用 returned 行类型的元素,如:
WHERE get_my_dep(emp_num).dep_code != 0
您可以尝试使用虚拟 table:
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 上测试的。
如果我有这样的存储过程:
get_my_dep(empNum)
它 returns 一行 例如:
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
大概存储过程被定义为 returning 多个值,如:
create procedure get_my_dep(emp_num int)
returning int as dep_code, int as dep_year, char(8) as dep_name;
在这种情况下,您可以创建一个 return 仅包含其中一个值的包装过程,然后在 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;
另一种方法是将过程定义为 return 行类型。例如:
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 子句中直接引用 returned 行类型的元素,如:
WHERE get_my_dep(emp_num).dep_code != 0
您可以尝试使用虚拟 table:
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 上测试的。