4

本质上,我的问题是我需要在 Oracle 中运行一个查询,该查询联合一个静态值列表(“静态”意味着它是从其他地方获得的,我无法从数据库中获取,但实际上是我插入的任意值列表查询)与从查询返回的值的动态列表。

因此,我的初始查询如下所示:

select * from (select ('18776') as instanceid from dual) union (<more complex query>)

我想,万岁!然后尝试使用更长的静态值列表来做到这一点。事实证明,如果我尝试运行,我会得到“缺少右括号”:

select ('18776','18775') as instanceid from dual

所以,我的基本问题是如何将静态值列表集成到这个联合中?

注意:这是问题的简化示例。实际列表是在我生成查询之前从 API 生成的,因此这个“静态”值列表不可预测且任意大。我不只处理 2 个静态值,它是一个任意列表。

4

3 回答 3

8
select '18776' as instanceid from dual union all
select '18775' as instanceid from dual 

或者

select column_value from table(sys.odcivarchar2list('18776', '18775'))

或某种分层查询,可以将您的逗号分隔字符串拆分为一组 varchar。

将这些与您的初始查询联合起来。

更新:“我不只处理 2 个静态值,它是一个任意列表。”

仍然可以作为集合传递给查询(以下只是许多可能的方法之一)

23:15:36 LKU@sandbox> ed
Wrote file S:\spool\sandbox\BUFFER_LKU_39.sql

  1  declare
  2    cnt int := 10;
  3    coll sys.odcivarchar2list := sys.odcivarchar2list();
  4  begin
  5    coll.extend(cnt);
  6    for i in 1 .. cnt loop
  7      coll(i) := dbms_random.string('l', i);
  8    end loop;
  9    open :result for 'select * from table(:c)' using coll;
 10* end;
23:37:03  11  /

PL/SQL procedure successfully completed.

Elapsed: 00:00:00.50
23:37:04 LKU@sandbox> print result

COLUMN_VALUE
-------------------------------------------------------------
g
kd
qdv
soth
rvwnq
uyfhbq
xxvxvtw
eprralmd
edbcajvfq
ewveyljsjn

10 rows selected.

Elapsed: 00:00:00.01
于 2013-09-11T15:09:36.963 回答
2

我想你想把它分成两个子查询:

select *
from ((select '18776' as instanceid from dual) 
      union
      (select '18775' as instanceid from dual) 
      union
      (<more complex query>)
     ) t;

请注意,union all性能优于union. 如果您知道没有重复项(或重复项无关紧要),请union all改用。

于 2013-09-11T15:10:37.010 回答
1

如果您有能力/权限来创建表类型,您可以这样做:

CREATE OR REPLACE 
TYPE TYP_NUMBER_TABLE AS TABLE OF NUMBER(11);

然后您可以使用 TABLE 函数从您在 SQL 中动态初始化的那种类型的实例中进行选择:

SELECT COLUMN_VALUE FROM TABLE(TYP_NUMBER_TABLE(1, 2, 3));

结果:

COLUMN_VALUE
------------
           1
           2
           3
于 2013-09-12T01:11:06.587 回答