如何在光标的 select 语句 where 子句中传递逗号分隔值

Posted

技术标签:

【中文标题】如何在光标的 select 语句 where 子句中传递逗号分隔值【英文标题】:How can I pass comma separated value in cursor's select statement where clause 【发布时间】:2019-02-20 09:38:45 【问题描述】:

我有以下块,它有一个光标和一个选择查询。我想传递选择的输出,用逗号分隔成 游标的select语句,放到where子句中。 我知道下面的代码会因为 Declare 部分中的 SQL 查询而引发错误,但是我如何使用数组或集合来实现这一点。

这里,id 列是数字

代码sn-p:

declare
test varchar2(30);
SELECT LISTAGG(value, ', ') WITHIN GROUP (ORDER BY value2) into test from table3 where value2=12;
cursor c1 (select * from table where id in (test))
begin
for i in c1 loop
null;
end loop;
end;

【问题讨论】:

【参考方案1】:

你为什么要这样做?

你可以简单的写你选择为:

Select * from table where id in (select value from table3 where value2=12)

编辑:

你还需要打开你的光标 c1,它才能在 AFAIK 中工作。

【讨论】:

隐式游标循环不需要OPEN 语句 “你为什么要这样做?”当您想在从第一个表中读取过滤器值并使用它们过滤第二个表的输出之间使用 PL/SQL 处理值列表时。 @MT0 但是没有理由把它变成 2 个 SQL 语句,并将回复保存在一个作用域变量中。当您可以构建整个光标并且只执行 1 次 IO 时。 在这种简单的情况下,当您在获取值和过滤它们之间没有做任何事情时,那么没有理由但是如果您引入一个中间步骤,在最终查询之前处理过滤器值列表那么有理由使用 2 个 SQL 语句。这正是我在之前的评论中提出的观点。 好的,但我们不要让它成为一种习惯,并推断出比 OP 所要求的更复杂的情况。【参考方案2】:

您可以使用集合和MEMBER OF 运算符:

Oracle 设置

CREATE TYPE IntegerList  AS TABLE OF NUMBER(8,0);
/

CREATE TABLE table1 ( value, value2 ) AS
SELECT 1, 1 FROM DUAL UNION ALL
SELECT 3, 4 FROM DUAL UNION ALL
SELECT 5, 3 FROM DUAL UNION ALL
SELECT 7, 2 FROM DUAL;

CREATE TABLE table2 ( id, value ) AS
SELECT 1, 11 FROM DUAL UNION ALL
SELECT 2, 22 FROM DUAL UNION ALL
SELECT 3, 33 FROM DUAL UNION ALL
SELECT 7, 77 FROM DUAL;

PL/SQL

DECLARE
  test IntegerList;
  c1 SYS_REFCURSOR;
BEGIN
  SELECT value
  BULK COLLECT INTO test
  FROM   table1;

  FOR r IN ( SELECT * FROM table2 WHERE id MEMBER OF test ) LOOP
    DBMS_OUTPUT.PUT_LINE( r.id || ', ' || r.value );
  END LOOP;
END;
/

输出

1, 11
3, 33
7, 77

db小提琴here

【讨论】:

以上是关于如何在光标的 select 语句 where 子句中传递逗号分隔值的主要内容,如果未能解决你的问题,请参考以下文章

如何在带有 select 语句的 where 子句中使用比较运算符?

Cursor Select 语句 where 条件根据条件而变化

在 WHERE 子句中使用 SELECT 语句

在通配符 where 子句中使用 Select 语句

在 Java DB2 JDBC 中:如何在 SELECT 语句的 WHERE 子句中使用空参数,其中值可以为空或不为空?

在mysql select语句中使用条件where子句