根据条件检索表中的数据,有多种查询方式,等值查询,模糊查询等。
等值查询就是将输入数据,于数据库中数据进行比较,若数据库表中某一个记录的字段值等于此数据,那么就找到了需要数据;
等值查询又分单个条件查询和多个条件查询。
模糊查询,就是在不清楚数据库表中,某一字段确切数据时,进行的一种模糊匹配查询。
例如:查询客户信息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