迭代SQL中的字符串列表,并为每个字符串运行SELECT
所以我有一个大约300个字符串的列表 我想遍历这个列表,并对每个字符串运行迭代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
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')