检查表的Oracle sql子查询从第一天到最后一天存在

时间:2010-12-08 09:24:21

标签: sql oracle

  

我的要求是从中检查   当月的第一个日期即   01/12/2010与表中的名称   格式suresh_20101201存在于   数据库,如果没有那么它应该检查   对于表suresh_20101202及其上   直到suresh_20101231。可能吗   在oracle sql查询中做。

例如

select  object_name from all_objects where object_type ='TABLE' 
and upper(object_name) = 'SURESH_' || to_char(TRUNC(SYSDATE, 'mm'),'YYYYMMDD')  
and ROWNUM =1

如果从dec的01到29日没有表,则上述查询应该运行到最后一天。

1 个答案:

答案 0 :(得分:2)

您可以创建一个方便的视图,例如:

CREATE OR REPLACE VIEW ALL_SURESH_TABLES AS
SELECT
  table_name,
  to_date(regexp_replace(table_name, 'SURESH_([[:digit:]]+)', '\1'), 'YYYYMMDD')
    AS table_date
FROM
  ALL_TABLES
WHERE
  regexp_like(table_name, 'SURESH_[[:digit:]]+')

然后像这样查询:

SELECT
  MAX(table_name) KEEP (DENSE_RANK LAST ORDER BY table_date)
FROM
  ALL_SURESH_TABLES
WHERE
  TRUNC(table_date, 'mm') = TRUNC(SYSDATE, 'mm')

(我没有验证第二个查询,但是一旦创建ALL_SURESH_TABLES视图就应该直接查询)

修改:根据您对“ORA-01830”错误的评论,我认为您至少有一个名称以SURESH_开头的表格,以...结尾数字,但这些数字不构成有效日期。例如,这会导致出现相同的错误:

/* Notice the "date" has nine digits instead of eight */
SELECT to_date('201012088', 'YYYYMMDD') FROM DUAL

因此,我建议你改变这个:

regexp_replace(table_name, 'SURESH_([[:digit:]]+)', '\1')

进入这个:

regexp_replace(table_name, 'SURESH_([[:digit:]]{8}).*', '\1')

修改后的正则表达式只会关注“SURESH_”之后的前八位数。