在不同的DB2表中的2列之间执行类似%的操作。

在不同的DB2表中的2列之间执行类似%的操作。,db2,ibm-midrange,rpgle,Db2,Ibm Midrange,Rpgle,在DB2上的SQLRPGLE programI系列中尝试实现以下功能 我有一个表a,表a有10个字段,这些字段是项目主控文件ITMMST文件中项目描述字段的10个搜索条件。表a的10个搜索条件将包含“ABC%”、“IND%”等值 现在,我想检查ITMMST中的所有项目,如果项目描述字段包含这些搜索条件中的任何一个 我试着在表A上做类似%的动作,但没有成功。我还试图在表A和ITMMST之间的内部联接的“ON”中给出类似的%,但这也不起作用 将10个标准放入程序字段也不起作用,因为表A中可能有多个记

在DB2上的SQLRPGLE programI系列中尝试实现以下功能

我有一个表a,表a有10个字段,这些字段是项目主控文件ITMMST文件中项目描述字段的10个搜索条件。表a的10个搜索条件将包含“ABC%”、“IND%”等值 现在,我想检查ITMMST中的所有项目,如果项目描述字段包含这些搜索条件中的任何一个

我试着在表A上做类似%的动作,但没有成功。我还试图在表A和ITMMST之间的内部联接的“ON”中给出类似的%,但这也不起作用

将10个标准放入程序字段也不起作用,因为表A中可能有多个记录,我必须检查所有10个字段中的所有记录

我能想到的唯一方法是在表a上放置一个光标,然后逐个记录地读取它,方法是将每个项目描述的值检索到程序字段中,然后使用“Like”进行检查。但这将对性能造成冲击,因为ITMMST是一个巨大的表


任何帮助都将不胜感激

动态构建SQL语句,然后立即执行。差不多

Statement = 'select (column list) from ITMMST where Description like (' + CompareField1 + ')';
exec sql execute immediate :Statement; 

只要根据需要添加尽可能多的比较。

您遗漏了很多细节,例如如果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 <> '')

不确定这将执行得如何,但优化器将利用提供的索引发挥最佳效果,或者它将告诉您如何制作更好的索引。

感谢您的帮助。。 我想出了一个办法

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    

谢谢斯科特!我确实想到了。。但是可能有多个记录,我必须在所有记录中搜索10个比较字段。。我想如果我只搜索一条记录的话,这会有用吗?看起来我必须遍历游标中的所有记录。不幸的是,此解决方案易受SQL注入的影响。非常感谢Mark!我确实得到了另一个解决方案,我已经张贴在这里