1

我正在编写一个使用 Oracle 数据库进行存储的 Java 软件。我可能最好将其描述为某种审计跟踪(?),记录我的测试观众做了什么,在什么日期,在什么电脑上。这些都是手动输入的,所以人们手动输入这些信息,然后将其保存到数据库中,然后由管理员查看。

这是我用于检索数据的 SQL 语句:

SELECT fld 1 as EmpNumber, 
fld2 as EmpName, 
fld6 as Date
FROM tblReportTemp  
LEFT JOIN tblPersonalInfo b ON $P{hrStoreOp}= b.ID_PERSONAL
WHERE computerName = $P{COMPNAME}
ORDER BY fld6,fld2 asc

我的队友决定将所有字段都设为 VARCHAR 类型,然后决定让用户输入日期,而不是使用日期选择器。所以很多测试用户,懒惰的用户,只是简单地放入最容易触及的东西,比如 Q 或 1,甚至是空格。所以首先,它不会按日期正确排列,其次,我尝试在安排数据之前通过 TO_DATE(fld6, 'MM/dd/yy') 将数据转换为日期失败,因为它无法将“Q”转换为日期。

我已经用日期选择器替换了文本框,但是,我们不允许修改数据库。

所以我提出的解决方案是修改我上面的SQL语句,过滤掉那些不能转换成日期的。是否有针对 Oracle 的 SQL 查询可以做到这一点?

谢谢。

4

2 回答 2

1

首先,拍拍你的队友的头,以便在varchar2列中存储日期。

其次,编写一个PL/SQL Pipelined Function过滤掉非日期行。我认为使用 plain 没有简单的方法可以做到这一点SQL

基本上,流水线函数允许您对一个或多个数据集执行编程操作,将自定义PL/SQL集合对象作为表行返回。然后可以在SELECT语句中使用这些函数:

SELECT col1, col2, col3, ...
FROM TABLE(my_pipelined_function(param1, param2, param3, ...))

可以在此处找到有关这些函数(包括示例代码)的更多详细信息。

于 2013-04-26T03:45:58.030 回答
1

您可以使用函数进行转换并将错误数据丢弃为 NULL:

CREATE OR REPLACE FUNCTION my_to_date(p_date_string IN VARCHAR2) RETURNS DATE
IS
BEGIN
  RETURN TO_DATE(p_date_string, 'MM/DD/YY');
EXCEPTION WHEN OTHERS THEN
  RETURN NULL;
END;

创建后使用它:

SELECT some_column
     , my_to_date(my_date_string_column) as real_date
FROM some_table
WHERE ...

此外,您确实应该将数据类型更改为 DATE 并强制用户仅输入有效日期。根据您问题中的列名,您的同事似乎正在尝试对所有内容使用通用的“弹性字段”。这通常是一个非常糟糕的主意,除非您真的打算在同一行中存储任意类型的数据(这通常也是一个坏主意)。

于 2013-04-26T04:58:25.407 回答