根据条件创建列

时间:2016-01-23 03:30:24

标签: sql oracle toad

所以我的目标是看看某些条件是否适用于我拥有的数据

我有这个问题:

select colA, colB
from tableA
where colB in ('catA','catB')
AND
colA in ('value1', 'value2', ..., 'value999') 
or colA in ('value1000', ..., 'value1999') 
or colA in ('value1000', ..., 'value1999') 
or colA in ('value1000', ..., 'value1999') 

我拥有所有OR子句的原因是因为我拥有如此多的数据,并且一次只能在列表中执行1000个项目。

所以我试图在这里解决两个问题。

:一种。上面的查询不起作用......它说

  

ORA-00936:缺少表达

它仅适用于列表的第一部分,所以我知道OR子句有问题。

B中。如果满足以下条件,如何修改select语句以获取新的Yes / No列:

where colB in ('catA','catB')

我得到是,否则是否?

1 个答案:

答案 0 :(得分:1)

尽管这是一次性查询,但这是一个非常糟糕的主意。 Oracle拥有1,000"列表"限制真的很好的理由。即使是包含1,000个项目的单个列表也需要一段时间才能编译。如果将此与简单连接进行对比,则编译时间几乎为零,执行时间不会超过您的列表。

对于数据库中的其他人来说,这也是一种更有礼貌的方法,因为你没有用数千个文字占用共享池。

即使这是一次性的事情,我建议您创建一个表(或GTT),加载您的值并将其作为一个简单的连接来执行:

create table temporary_values (
  in_list_string varchar2(1000) not null,
  constraint temporary_values_pk primary key (in_list_string)
);

使用SQL * Loader之类的工具加载您的值,或者以老式的方式进行。然后运行您的查询:

select A.colA, A.colB
from
  tableA A
  join temporary_values t on
    A.colA = t.in_list_string
where
  A.colB in ('catA', 'catB');

如果主键很痛苦,您可以随时删除它并将查询作为半连接进行以避免重复:

select A.colA, A.colB
from
  tableA A
where
  A.colB in ('catA', 'catB') and
  exists (
    select null
    from temporary_values t
    where A.colA = t.in_list_string
  );

如果您的and成为or,则可以使用左连接来解决此问题:

select A.colA, A.colB
from
  tableA A
  left join temporary_values t on
    A.colA = t.in_list_string
where
  t.in_list_string is not null or
  A.colB in ('catA', 'catB');

如果有任何编译错误或执行错误,那么与搜索数千个文字中缺少的逗号或错误引用相比,它们将更容易找到批次