试图在DB2上的SQLRPGLE程序(I系列)中实现以下目标
我有一个表(表A),其中有10个字段,它们是项描述字段的10个搜索条件(在ITMMST文件的项目主文件中)。表A的10个搜索条件将包含“ ABC%”,“ IND%'等 现在,我要检查ITMMST中的所有项目,如果“项目描述”字段字段包含任何这些搜索条件。
我尝试对表A进行%的操作,但是没有用。我还尝试在表A和ITMMST之间的“内部”连接的“ ON”中给Like%,但这也没有用。
将10个条件放入“程序”字段中也将不起作用,因为表A中可能有多个记录,我必须检查所有记录的所有10个字段。
我能想到的唯一方法是在表A上有一个光标,并逐条记录读取它(通过将值检索到程序字段中)来读取每个项目说明,然后使用“赞”进行检查。但这会影响性能,因为ITMMST是一张巨大的桌子。
任何帮助将不胜感激!
答案 0 :(得分:1)
您遗漏了许多细节,例如,如果A中的条件字段为空白,怎么办?如果A中有多个记录与主数据库中的单个记录匹配,该怎么办?我将假设空白标准将被忽略,重复项将被抑制。
select distinct *
from ITMMST
cross join TABLEA
where (description like criteria1 and criteria1 <> '')
or (description like criteria2 and criteria2 <> '')
...
or (description like criteria10 and criteria10 <> '')
不确定这样做的效果如何,但是优化程序将通过提供的索引来使其达到最佳状态,或者它将告诉您如何制作更好的索引。
答案 1 :(得分:0)
动态构建您的SQL语句,然后立即执行。像
Statement = 'select (column list) from ITMMST where Description like (' + CompareField1 + ')';
exec sql execute immediate :Statement;
只需添加所需的比较数即可。
答案 2 :(得分:0)
感谢您的所有帮助。 我想出了一种方法。
selECT * FROM ITMMST A
INNER JOIN(
SELECT TRIM(Criteria1) AS SPARM FROM TableA WHERE TRIM(WMSCT1) <> ''
UNION ALL
SELECT TRIM(Criteria2) AS SPARM FROM TableA WHERE TRIM(WMSCT2) <> ''
UNION ALL
SELECT TRIM(Criteria3) AS SPARM FROM TableA WHERE TRIM(WMSCT3) <> ''
UNION ALL
SELECT TRIM(Criteria4) AS SPARM FROM TableA WHERE TRIM(WMSCT4) <> ''
UNION ALL
SELECT TRIM(Criteria5) AS SPARM FROM TableA WHERE TRIM(WMSCT5) <> ''
UNION ALL
SELECT TRIM(Criteria6) AS SPARM FROM TableA WHERE TRIM(WMSCT6) <> '' ) ..........
AS SLIST
ON A.ITEM_DESC Like SLIST.SPARM