暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Oracle 想要在运算符中有1000值

ASKTOM 2021-02-25
347

问题描述

你好,

我面临一个问题,我需要在查询运算符中有1000多个值。

请建议一些方法。这里是给你的代码片段。

注意: RMID IN可以具有1000值。也曾尝试使用OR RMID IN ()-对于大于999的值。不确定性能。请帮忙

select count ( case when attandingtype = 1 then '1' end )  as existing_hp_count,
       count ( case when attandingtype = 2 then '1' end )  as new_hp_count,
       count ( case when attandingtype = 3 then '1' end )  as policy_count
from worktracker
where trunc (calldate) between add_months ( trunc (sysdate), -3 ) and trunc (sysdate)
and   rmid in ('1001', '1212');
复制


谢谢!

专家解答

您的基本选择是:

Use a (temporary) table

首先将值加载到另一个表中,然后在您的in条件下使用temp表:

insert into gtt ...

select * from worktracker
where  rmid in ( select id from gtt );
复制


好处是你可以处理任意数量的值。缺点是你有一个额外的插入要做,减慢了过程。

Split the list into groups < 1,000

select * from worktracker
where  rmid in ( 1, ..., 999 )
or  rmid in ( 1001, ..., 1999 )
or ...
复制


您现在可以处理任意数量的值,尽管您必须自己管理值拆分。

最大的缺点是优化器很难获得一个有大量或列表的好计划; 记住是许多OR的简写。

另外-假设您每次更改搜索的值数量-这可能会导致大量解析 (通常在列表中大的问题),这是一件坏事。而且由于SQL的文本相对较长,因此解析本身可能需要一段时间。

Use a multi-value IN list

您可以将许多值与IN列表进行比较; 这些值允许您比较1,000多个项目。

为此,请选择一个常量值,并在此列和列周围加上括号。然后检查这是否在一系列中:

(常量,值)

例如:

select * from worktracker
where  ( 1, rmid ) in (
  ( 1, '1001' ),
  ( 1, '1212' ),
  ...
)
复制


这与将值拆分为块 <1,000有类似的缺点; 您可能有很多缓慢的解析,并且可能有次优计划。

Pass the values as one string and split it in SQL

在这里,您将值作为一个字符串传递,然后使用您最喜欢的csv到行方法将其拆分。

例如:

with vals as (
  select '1001,1212' search_values from dual
), rws as (
  select regexp_substr ( search_values, '[^,]+', 1, l ) v
  from   vals, lateral (
    select level l
    from   dual
    connect by level <= length ( search_values ) - 
      length ( replace ( search_values, ',' ) ) + 1
  )
) 
  select * from worktracker
  where  rmid in ( select * from rws );
复制


这样做的好处是您可以使search_values成为bind变量。缺点是,如果您要搜索> 1,000值,则很容易达到varchar2限制 (32,767),因此您可能会遇到错误。

PS-在我看来,您正在将行转换为列-也就是枢轴。您可能想要在卷积的大小写表达式上使用pivot运算符:

https://blogs.oracle.com/sql/how-to-convert-rows-to-columns-and-back-again-with-sql-aka-pivot-and-unpivot
文章转载自ASKTOM,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论