Sql 基于条件创建列

Sql 基于条件创建列,sql,oracle,toad,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 ('valu

因此,我的目标是查看特定条件是否适用于我拥有的数据

我有一个疑问:

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项

所以我想在这里解决两个问题

A.上面的查询不起作用……它说

ORA-00936:缺少表达式

它只适用于列表的第一部分,因此我知道OR子句有问题。

B.如果满足此条件,如何修改select语句以获得新的“是/否”列:

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

我得到的是肯定的,否则是否定的?

尽管这是一个一次性查询,但这是一个非常糟糕的主意。Oracle有1000个“在列表中”的限制,这是有充分理由的。即使是一个包含1000个项目的列表也需要一段时间来编译。如果将其与简单联接进行对比,编译时间几乎为零,执行时间也不会超过in列表的时间

对于数据库中的其他人来说,这也是一种更加礼貌的方法,因为您不会占用数千个文本的共享池

即使这是一次性的,我建议您创建一个表(或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
  );
如果您的
变为
,您可以使用左连接解决此问题:

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');

如果有任何编译或执行错误,它们将比在数千个文本中搜索缺少的逗号或放错位置的引号更容易找到。

这里有一个解决限制的方法:--或者使用连接选项。关于你的第二个问题,看看你的问题,这不总是正确的吗?或者你是在喝可乐还是在喝可乐?在这种情况下,可以使用
case
语句创建临时列:
case当colb In('cata','catb')然后'yes'否则'no'结束为newcolumn
尽管数据不在另一个表中,但都是手动粘贴的。对于第二个问题,基本上我只需要检查tableA中正在粘贴的记录,然后检查那些记录,如果它符合所述条件,则输出Yes,否则NoI建议重新设计表,这样您就不需要在where语句中指定500+个值,因为它是性能杀手—每次SQL(实际上是MD5哈希)Oracle必须解析一个新的查询,而基于成本的优化器必须寻找一个新的执行计划。这太昂贵了!如果您能给我们提供更多关于您想要实现什么的详细信息,那么给您更详细的建议会更容易…是的,我意识到这不是理想的情况,但这是一个一次性的查询