所以我不能创建或编辑表(我是具有只读权限的用户),我想查找 10,000 个唯一 ID。我不能将它们放在 IN() 语句中,因为 oracle 限制超过 1000 个项目。
是否可以从 oracle 的 DUAL 表中选择整个列表?就像是:
select
'id123,id8923,id32983,id032098,id308230,id32983289'
from DUAL
所以我不能创建或编辑表(我是具有只读权限的用户),我想查找 10,000 个唯一 ID。我不能将它们放在 IN() 语句中,因为 oracle 限制超过 1000 个项目。
是否可以从 oracle 的 DUAL 表中选择整个列表?就像是:
select
'id123,id8923,id32983,id032098,id308230,id32983289'
from DUAL
使用集合(它们不限于像IN
子句那样的 1000 个项目):
SELECT COLUMN_VALUE AS id
FROM TABLE(
SYS.ODCIVARCHAR2LIST(
'id123', 'id8923', 'id32983', 'id032098', 'id308230', 'id32983289'
)
)
SYS.ODCIVARCHAR2LIST
并且SYS.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);
如果您可以创建一个集合类型,那么您甚至不需要TABLE
表达式,并且可以使用运算符直接在WHERE
子句中使用它MEMBER OF
:
CREATE OR REPLACE TYPE stringlist IS TABLE OF VARCHAR2(200);
/
SELECT *
FROM yourtable
WHERE id MEMBER OF stringlist(
'id123', 'id8923', 'id32983', 'id032098', 'id308230', 'id32983289'
);
您甚至可以将值作为绑定参数传递 - 请参阅我的答案here
Oracle 仍然不支持VALUES
行构造函数,所以只有两个丑陋的解决方法:
1000 项限制不适用于多列 IN 条件
以逗号分隔的表达式列表最多可以包含 1000 个表达式。以逗号分隔的表达式集合列表可以包含任意数量的集合,但每个集合最多可以包含 1000 个表达式。
所以你可以这样做:
where (1,id) in ( (1,'id123'),
(1,'id8923'),
(1,'id32983'),
(1,'id032098'), .... )
或者使用一个又大又丑的 UNION ALL:
with idlist (xid) as (
select 'id123' from dual union all
select 'id8923' from dual union all
.....
select 'id32983' from dual
)
select ...
from some_table
where id in (select xid from idlist);
另一种解决方法
select *
from t
where id in ('id1','id2','id3',...,'id1000')
or id in ('id1001','id1002','id1003',...,'id2000')
or id in ('id2001','id2002','id2003',...,'id3000')
or ...
一种解决方案是 WITH 子句:
with ids as (
select 'id123' as uid from dual union all
select 'id8923' as uid from dual union all
select 'id32983' as uid from dual union all
select 'id032098' as uid from dual union all
select 'id308230' as uid from dual union all
select 'id32983289' as uid from dual
)
select *
from ids
join your_table yt
on yt.id = ids.uid
这可能看起来有点麻烦,但大概您在电子表格或其他任何东西中都有您的 UID 列表。如果是这样,使用正则表达式生成这些选择语句很容易。只需将该列剪切'n'粘贴到支持正则表达式搜索和替换的编辑器中。