迭代SQL中的字符串列表,并为每个字符串运行SELECT

迭代SQL中的字符串列表,并为每个字符串运行SELECT,sql,oracle,for-loop,Sql,Oracle,For Loop,所以我有一个大约300个字符串的列表 我想遍历这个列表,并对每个字符串运行SELECT语句 示例: theList = ['account1', 'account2', 'account3'] for eachItem in theList: SELECT * from aTable where accountName = eachItem 这里需要注意的一点是,我不能在这个数据库中插入或创建一个表,因为这是一个生产数据库 300个字符串的列表是包含50000个条目的列accountN

所以我有一个大约300个字符串的列表

我想遍历这个列表,并对每个字符串运行
SELECT
语句

示例:

theList = ['account1', 'account2', 'account3']

for eachItem in theList:
   SELECT * from aTable where accountName = eachItem
这里需要注意的一点是,我不能在这个数据库中插入或创建一个表,因为这是一个生产数据库

300个字符串的列表是包含50000个条目的列
accountName
的一部分

这就是我一直在尝试的,我不知道如何让它工作:

DECLARE 
   theaccount varchar(100); 
BEGIN 
   FOR theaccount in ['account1','account2'] LOOP 

      (
      select * 
      from aTable
      where 
      accountName = theaccount

      ); 
  END LOOP; 
END; 

您的逻辑似乎是希望所有帐户名与您的300个帐户列表相匹配的记录都来自
aTable
。SQL非常喜欢使用基于集合的操作,因此这里最简单的解决方案是将这300个匹配的帐户名加载到一个临时表中,然后运行以下查询:

SELECT *
FROM aTable t1
WHERE EXISTS (SELECT 1 FROM temp_accounts t2 WHERE t2.accountName t1.accountName);

有关创建临时表的详细信息,请参见。请注意,大多数情况下,使用临时表代替更好的选项(如创建永久表)是不好的做法。但是,考虑到这个临时表只包含300个单点数据,它不应该给您的生产系统带来太大的压力。

您的逻辑似乎是希望所有记录都来自
aTable
,其帐户名与您的300个帐户列表相匹配。SQL非常喜欢使用基于集合的操作,因此这里最简单的解决方案是将这300个匹配的帐户名加载到一个临时表中,然后运行以下查询:

SELECT *
FROM aTable t1
WHERE EXISTS (SELECT 1 FROM temp_accounts t2 WHERE t2.accountName t1.accountName);

有关创建临时表的详细信息,请参见。请注意,大多数情况下,使用临时表代替更好的选项(如创建永久表)是不好的做法。但是,考虑到这个临时表只能容纳300个单点数据,它应该不会给生产系统带来太大的压力。

如果您得到字符串的串联,那么下面的方法将执行相同的操作,而不是逐行循环光标的方法

更干净,性能更好

create table t(x int, y varchar2(30));

insert into t 
select level,to_char(level)
  from dual
connect by level<=20;

--Passing a list of varchar as '12','9','5'
select *
  from t
where y in (select * 
              from TABLE(sys.odcivarchar2List('12','9','5'))
            )  
创建表t(x int,y varchar2(30));
插入t
选择级别,以显示字符(级别)
来自双重

按级别连接如果您得到字符串的串联,那么下面的方法将执行相同的操作,而不是通过游标循环的逐行方法

更干净,性能更好

create table t(x int, y varchar2(30));

insert into t 
select level,to_char(level)
  from dual
connect by level<=20;

--Passing a list of varchar as '12','9','5'
select *
  from t
where y in (select * 
              from TABLE(sys.odcivarchar2List('12','9','5'))
            )  
创建表t(x int,y varchar2(30));
插入t
选择级别,以显示字符(级别)
来自双重

按级别连接您可以在oracle中查找
隐式游标
oracle中没有名为“list”的数据类型,您的意思是将包含300个条目的字符串串联起来吗?我通常只是将所有字符串串联起来,然后运行一个非常长的查询,如
SELECT*from aTable where accountName in('account1','account2',…,'account300'))
您可以在oracle中查找
隐式游标
oracle中没有名为“list”的数据类型,您是指包含300个条目的字符串的串联吗?我通常只是串联所有字符串,然后运行一个非常长的查询,如
SELECT*from aTable where accountName in('account1','account2',…,'account300')