У меня есть столбец в таблице с простыми sql-запросами, и я хочу получить от них имя таблицы regexp_substr. Примеры текстов:
SELECT PT.PT_PARTY_NAME VALUE,PT.PT_PARTY_NAME LABEL
FROM DWH_OWNER.DWH_ACCOUNTS ACC,
DWH_OWNER.DWH_PARTIES PT
WHERE ACC.ACC_SOURCE_ID = :P_DOMVAL_REF1
AND ACC.ACC_PT_KEY = PT.PT_KEY
or
SELECT DISTINCT QRMPT_PRODUCT VALUE, QRMPT_PRODUCT LABEL FROM
DWH_OWNER.DWH_QRM_PRODUCT_TYPES ORDER BY VALUE
Итак, мне нужно найти «ОТ», пропустить несколько пробелов, а затем получить первое слово. Меня пока не интересует вторая таблица.
Что я сделал:
select
sql,
regexp_substr(upper(sql), '(\s)FROM(\s)*([[:alnum:]]|\.|_)*') tablename
from my_table_with_queries;
Выход:
FROM DWH_OWNER.DWH_ACCOUNTS
FROM
DWH_OWNER.DWH_QRM_PRODUCT_TYPES
Что не так с моим qyery: он выводит имя таблицы с «FROM» перед именем таблицы. Я хочу имя таблицы напрямую, без пробелов.
Желаемый результат:
DWH_OWNER.DWH_ACCOUNTS
DWH_OWNER.DWH_QRM_PRODUCT_TYPES
EDIT: мне удалось сделать regexp_substr(tablename, '(\w|_|\.)+', 1,2)
по сравнению с предыдущим шагом, чтобы очистить имя таблицы. Но можно ли получить желаемый результат с помощью одного регулярного выражения?
Здесь должен быть sqlfiddle, но сайт в этот момент не работает. Запрос:
with a as (
select 'SELECT PT.PT_PARTY_NAME VALUE,PT.PT_PARTY_NAME LABEL
FROM DWH_OWNER.DWH_ACCOUNTS ACC,
DWH_OWNER.DWH_PARTIES PT
WHERE ACC.ACC_SOURCE_ID = :P_DOMVAL_REF1
AND ACC.ACC_PT_KEY = PT.PT_KEY' sql from dual
union all
select 'SELECT DISTINCT QRMPT_PRODUCT VALUE, QRMPT_PRODUCT LABEL FROM
DWH_OWNER.DWH_QRM_PRODUCT_TYPES ORDER BY VALUE' from dual
)
select
regexp_substr(upper(sql), '\sFROM\s*(\w|\.|_)*') tablename, sql
from a;
\sFROM\s*([\w.]*)
? - person Thomas Ayoub   schedule 09.02.2016regexp_substr(sql,'\sFROM\s*(\w|\.)*')
- да, но по-прежнему будет выводить FROM. Это моя проблема. - person Florin Ghita   schedule 09.02.2016\s
? - person Thomas Ayoub   schedule 09.02.2016