You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在SQL*Loader控制文件WHEN子句中使用>或<进行条件筛选?

SQL*Loader筛选REQUEST_DATE大于SYSDATE的正确方法

原控制文件的问题在于:SQL*Loader的WHEN子句仅能对原始输入的字符串字段进行比较,无法直接使用数据库函数SYSDATE,也不能引用经过类型转换后的日期字段(字段转换逻辑在WHEN筛选之后执行)。

下面提供两种可行的解决方案:

方案1:通过参数传递格式化后的当前日期字符串

将当前系统日期转换为和输入文件中REQUEST_DATE一致的字符串格式(DD-MM-YYYY),作为参数传递给控制文件,直接在WHEN子句中做字符串比较(该格式下字符串的大小关系等价于日期的大小关系)。

步骤:

  1. 生成匹配格式的当前日期字符串(以Linux为例):
export CUR_DATE=$(date +"%d-%m-%Y")
  1. 修改控制文件,使用参数变量:
LOAD DATA
INFILE 'Sample2.dat'
APPEND INTO TABLE EMP_LEAVE
WHEN REQUEST_DATE > '&CUR_DATE'
FIELDS TERMINATED BY ","
(REQUEST_NO,
EMPNO,
REQUEST_DATE    DATE    "DD-MM-YYYY",
START_DATE  DATE    "DD-MM-YYYY",
END_DATE        DATE    "DD-MM-YYYY",
REASON,
LEAVE_TYPE,
NO_OF_DAYS,
APPROVAL
)
  1. 调用SQL*Loader时传递参数:
sqlldr username/password@database control=your_control_file.ctl CUR_DATE='$(date +"%d-%m-%Y")'

方案2:先加载到临时表,再用SQL筛选插入

这种方法更稳妥,适合日期格式复杂或字符串比较可能出错的场景:

  1. 修改控制文件,将数据先加载到临时表EMP_LEAVE_TMP:
LOAD DATA
INFILE 'Sample2.dat'
APPEND INTO TABLE EMP_LEAVE_TMP
FIELDS TERMINATED BY ","
(REQUEST_NO,
EMPNO,
REQUEST_DATE    DATE    "DD-MM-YYYY",
START_DATE  DATE    "DD-MM-YYYY",
END_DATE        DATE    "DD-MM-YYYY",
REASON,
LEAVE_TYPE,
NO_OF_DAYS,
APPROVAL
)
  1. 执行SQL语句筛选插入目标表:
INSERT INTO EMP_LEAVE
SELECT * FROM EMP_LEAVE_TMP
WHERE REQUEST_DATE > SYSDATE;

-- 可选:清理临时表
TRUNCATE TABLE EMP_LEAVE_TMP;

内容的提问来源于stack exchange,提问作者John Joy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.25 09:24:26