RPG中实现类似SQL等值查询和模糊查询

根据条件检索表中的数据,有多种查询方式,等值查询,模糊查询等。

等值查询就是将输入数据,于数据库中数据进行比较,若数据库表中某一个记录的字段值等于此数据,那么就找到了需要数据;

等值查询又分单个条件查询和多个条件查询。

模糊查询,就是在不清楚数据库表中,某一字段确切数据时,进行的一种模糊匹配查询。

例如:查询客户信息CUSTINFO表中,地址字段ADDR中包含“长春”两个字的记录,

就可以使用这样的查询语句:SELECT * FROM CUSTINFO WHERE ADDR LIKE ‘%长春%’。

模糊查询,分为单个字符匹配和多字符匹配,上面用到的LIKE ‘%长春%’,是一种多个字符匹配的例子,单个字符使用单个下划线“_”进行匹配,

例如LIKE ‘_ABC’就是匹配,长度为4,且后三个字符为ABC的数据。

搜索引擎对于CUSTINFO表中的数据,是逐个的进行比较,即在读取到一条数据的时候,根据WHERE谓词后面的条件进行比较。

在ILE RPG中,多条件等值查询也是常用到的,下面分析一个例子。

--先将指针定位到物理文件的第一条数据
I_STRDAT      SETLL     ABCD23                             
              READ      ABCD23                             
--①读取到一条记录
              DOW       NOT %EOF                           
--②对当前读取的数据进行处理
--a
              IF        I_PCOD <> ' ' AND K23PCOD <> I_PCOD
              READ      ABCD23                             
              ITER                                         
              ENDIF                                        
--b
              IF        I_ARACD <> *BLANK      AND         
                        K23REQARA <> I_ARACD               
              READ      ABCD23                             
              ITER                                         
              ENDIF                                        
--c
              IF        I_APLYORG <> *BLANK     AND        
                        K23REQORG <> I_APLYORG     
              READ      ABCD23                     
              ITER                                 
              ENDIF                                
--d
              IF        K23REQDAT > I_ENDDAT       
              LEAVE                                
              ENDIF                                
--③执行输出数据子例程
              EXSR      @OUTPUT                    
--④在对下一条数据进行比较的时候,先读取,否则将对一条数据进行重复处理,造成死循环。
              READ      ABCD23                     
              ENDDO                                

上面例子中,做标记的a、b、c三个IF语句,就是SQL等值查询中的三个筛选条件;

需要注意的是,这三个IF语句都是操作同一条记录;

对于第一个IF,如果不满足它,则表示输入数据与物理文件中当前记录的K23REQARA字段相等,作为搜索的一个条件;

下面的IF语句功能与第一个相同,这样对数据进行一条一条的处理,直到遍历完整个物理文件里面的数据。

如果将上面这段RPG代码转换为SQL查询,将会得到下面的SQL语句:

SELECT * FROM ABDC23         
WHERE   K23REQDAT <= I_ENDDAT 
  AND ( K23PCOD = I_PCOD      
   OR   K23REQARA = I_ARACD   
   OR   K23REQORG = I_APLYORG)

对于SQL中的模糊查询,RPG程序中可以使用操作码SCAN,或者内置函数%SCAN去实现,如下:

I_ARACD      SCAN        K23REQARA
             IF            %FOUND
             ……
             ENDIF
--或者
             EVAL         V_I = %SCAN(%TRIM(I_ARACD): K23REQARA:1)
             IF            V_I > 0
             ……
             ENDIF

--THE END--

你可能感兴趣的:(RPG中实现类似SQL等值查询和模糊查询)