首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Oracle SQL:匹配long,逗号分隔列表

Oracle SQL:匹配long,逗号分隔列表
EN

Stack Overflow用户
提问于 2022-03-27 15:23:15
回答 2查看 111关注 0票数 1

我们使用Oracle 11g,并且我正在从我们的制造执行系统访问一个数据库,在这个系统上我没有任何写权限。我不能用临时桌子。我必须检索生产ID的长列表的数据。生产ID的格式是灵活的,所以我也可以使用不同的格式,但我认为逗号分隔的列表非常方便。然而,我的问题是如何过滤我的要求一个长长的列表?使用in

代码语言:javascript
复制
SELECT 
    productionid, 
    tool, 
    proddate 
FROM 
    proddb 
WHERE 
    productionid in ('123','231','312', ...)

不是很快,限制在1000个条目,我想不是为这个场景设计的。那么,筛选数百或1000个生产ids的大列表的最佳方法是什么?

EN

回答 2

Stack Overflow用户

发布于 2022-03-27 16:02:32

选项1:使用集合:

代码语言:javascript
复制
CREATE TYPE string_list IS TABLE OF VARCHAR2(20);

然后:

代码语言:javascript
复制
SELECT productionid, tool, proddate 
FROM   proddb 
WHERE  productionid MEMBER OF string_list('123','231','312',...);

或者,使用内置的SYS.ODCI*LIST类型:

代码语言:javascript
复制
SELECT productionid, tool, proddate 
FROM   proddb 
WHERE  productionid IN (SELECT column_value
                        FROM   TABLE(SYS.ODCIVARCHAR2LIST('123','231','312',...)));

选项2:使用多维IN列表绕过1000项限制:

代码语言:javascript
复制
SELECT productionid, tool, proddate 
FROM   proddb 
WHERE  (productionid, 1) IN ((123,1),(231,1),(321,1),...);

选项3:使用子查询:

代码语言:javascript
复制
SELECT productionid, tool, proddate 
FROM   proddb 
WHERE  productionid IN (
         SELECT 123 FROM DUAL UNION ALL
         SELECT 213 FROM DUAL UNION ALL
         SELECT 321 FROM DUAL -- UNION ALL ...
       )

或者:

代码语言:javascript
复制
SELECT productionid, tool, proddate 
FROM   proddb p
       INNER JOIN (
         SELECT 123 AS id FROM DUAL UNION ALL
         SELECT 213 FROM DUAL UNION ALL
         SELECT 321 FROM DUAL -- UNION ALL ...
       ) i
       ON (p.productionid = i.id)

代码语言:javascript
复制
WITH filters AS (
  SELECT 123 AS id FROM DUAL UNION ALL
  SELECT 213 FROM DUAL UNION ALL
  SELECT 321 FROM DUAL -- UNION ALL ...
)
SELECT productionid, tool, proddate 
FROM   proddb p
       INNER JOIN filters f
       ON (p.productionid = f.id)
票数 1
EN

Stack Overflow用户

发布于 2022-03-27 16:10:57

正如前面已经说过的,最好的方法是通过简单的标准(分组数据、日期等)找到一个表/一组表,返回所需的it。

但是,如果您绝对必须使用一组庞大的任意in进行查询,而且如果一致性对您来说不是问题(即数据在一瞬间不会发生很大的变化),您还可以将查询分割为4或5个查询,每个查询有1000个条目。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71637651

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档