我有一些表以日期结束(YYYYMMDD),有些以HHMMSS结尾:
INVENLEVEL_20160419
INVENLEVEL_20160419_120232 <-optional to exist
INVENLEVEL_20160425
INVENLEVEL_20160426
INVENLEVEL_20160426_032112 <-optional to exist
我需要在7天内保留桌子并放弃其他INVENLEVEL表格。
预期结果,删除了以下2个表:
INVENLEVEL_20160419
INVENLEVEL_20160419_120232
我可以删除包含日期的表格,但不能删除带有HHMMSS的表格。
FOR x IN ( SELECT TABLE_NAME
FROM USER_TABLES
WHERE REGEXP_LIKE(TABLE_NAME, 'INVENLEVEL_[[:digit:]]{8}')
AND TO_DATE(SUBSTR(TABLE_NAME, -8), 'yyyymmdd') <= TRUNC(SYSDATE) - 7
) LOOP
EXECUTE IMMEDIATE 'DROP TABLE ' ||
x.TABLE_NAME ||
' PURGE';
我怎样才能使用HHMMSS下桌呢?请注意,具有HHMMSS的表是可选的存在,意味着,有时我们拥有它,有时不存在。
答案 0 :(得分:2)
这样的事情,也许是:
with sample_data as (select 'INVENLEVEL_20160419' table_name from dual union all
select 'INVENLEVEL_20160419_120232' table_name from dual union all
select 'INVENLEVEL_20160425' table_name from dual union all
select 'INVENLEVEL_20160426' table_name from dual union all
select 'INVENLEVEL_20160426_032112' table_name from dual union all
select 'NEW_20160426_032112' table_name from dual union all
select 'FRED' table_name from dual)
---- end of mimicking your data; see SQL below
select table_name,
to_date(substr(table_name, 12, 8), 'yyyymmdd') dt
from sample_data
where REGEXP_LIKE(TABLE_NAME, '^INVENLEVEL_[[:digit:]]{8}($|_[[:digit:]]{6})')
and to_date(substr(table_name, 12, 8), 'yyyymmdd') <= trunc(sysdate -7);
TABLE_NAME DT
-------------------------- ----------
INVENLEVEL_20160419 19/04/2016
INVENLEVEL_20160419_120232 19/04/2016
显然,您不需要sample_data子查询 - 我只是使用它来使SQL的数据起作用。你会查询你的user_tables。
我修改了你的正则表达式,另外检查它是否在8位数之后到达了字符串的末尾,或者有另一个下划线后跟6位数。
然后我修改你的substr来检查第12个位置的8个字符,以便得到日期 - 你必须这样做,因为如果你像你一直在使用字符串的结尾,日期不一定是8个字符。