如何在oracle SQL中从dual中选择10,000个唯一id的列表

bar*_*ker 2 sql oracle dual-table

所以我无法创建或编辑表(我是具有只读权限的用户)并且我想查找 10,000 个唯一 ID。我无法将它们放在 IN() 语句中,因为 oracle 限制超过 1000 个项目。

是否可以从 oracle 中的 DUAL 表中选择整个列表?就像是:

select  
'id123,id8923,id32983,id032098,id308230,id32983289'  
from DUAL
Run Code Online (Sandbox Code Playgroud)

MT0*_*MT0 7

使用集合(它们不像IN子句那样限制为 1000 个项目):

SELECT COLUMN_VALUE AS id
FROM   TABLE(
         SYS.ODCIVARCHAR2LIST(
           'id123', 'id8923', 'id32983', 'id032098', 'id308230', 'id32983289'
         )
       )
Run Code Online (Sandbox Code Playgroud)

SYS.ODCIVARCHAR2LISTSYS.ODCINUMBERLIST是架构中提供的集合类型SYS

您可以直接将其连接到您所在的任何表,SELECT而无需使用该DUAL表:

SELECT y.*
FROM   your_table y
       INNER JOIN TABLE(
         SYS.ODCIVARCHAR2LIST(
           'id123', 'id8923', 'id32983', 'id032098', 'id308230', 'id32983289'
         )
       ) i
       ON (y.id = i.COLUMN_VALUE);
Run Code Online (Sandbox Code Playgroud)

如果您可以创建一个集合类型,那么您甚至不需要表达式TABLE,可以使用运算符直接在WHERE子句中使用它MEMBER OF

CREATE OR REPLACE TYPE stringlist IS TABLE OF VARCHAR2(200);
/
Run Code Online (Sandbox Code Playgroud)
SELECT *
FROM   yourtable
WHERE  id MEMBER OF stringlist(
                      'id123', 'id8923', 'id32983', 'id032098', 'id308230', 'id32983289'
                    );
Run Code Online (Sandbox Code Playgroud)

您甚至可以将这些值作为绑定参数传递 - 请参阅此处我的答案