Oracle sql Подзапрос для проверки таблицы существует с первого дня до последнего - PullRequest
1 голос
/ 08 декабря 2010

Мое требование - проверить у первая дата текущего месяца т.е. 01/12/2010 с именем таблицы в формат suresh_20101201 существует в базы данных, если нет, то следует проверить для стола суреш_20101202 и на нем до suresh_20101231. Является ли это возможным делать в SQL-запросе Oracle

например

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

указанный выше запрос должен выполняться до последнего дня, если с 01 по 29 декабря таблицы не существует.

1 Ответ

2 голосов
/ 08 декабря 2010

Вы можете создать вспомогательное представление, например:

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_".

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...