Управление нулевыми значениями xmlagg - PullRequest
0 голосов
/ 27 апреля 2019

У меня запрос следующей структуры:

SELECT 'SELECT ' || col_list || ' from schema.table;' from( Select table_name,  rtrim(xmlagg(xml element(e,  Case when datatype in ('blob', 'timestamp') then null else column_name end , ', ').extract('//text()') order by c_id).getclobval(), ', ' ) col_list from all_tab_cols where schema ='schema' and table in ('t1', 't2') group by table_name)

Это дает мне вывод, когда первые два, четвертый и шестой столбцы имеют тип blob или timestamp:

SELECT ,  ,  third_col, , fifth_col, from schema.table;

Как изменить запрос таким образом, чтобы он предоставлял:

SELECT third_col,  fifth_col from schema.table;

Этот результирующий оператор выбора далее сохраняется как строка в кадре данных spark (я использую Scala).Так что, если мы можем изменить запрос с помощью регулярных выражений или замены подстрок, это тоже может сработать, и я тоже открыт для этих предложений, но я был бы признателен, если бы мне не пришлось взламывать этот способ и управлять им.на самой стороне запроса.

1 Ответ

0 голосов
/ 27 апреля 2019

Я думаю, вы слишком усложняете это; просто не включайте эти столбцы, отфильтровывая их в предложении where:

...
  from all_tab_cols
  where owner = 'schema'
  and table_name in ('t1', 't2')
  and data_type != 'BLOB'
  and data_type not like 'TIMESTAMP%'
  group by table_name
)

Затем вы можете удалить выражение регистра.

Вы также можете немного упростить это:

select 'SELECT '
  || rtrim(xmlagg(xmlelement(e, column_name, ', ').extract('//text()') order by column_id).getclobval(), ', ' )
  || ' FROM ' || owner || '.' || table_name || ';'
from all_tab_cols
where owner = 'schema'
and table_name in ('t1', 't2')
and data_type != 'BLOB'
and data_type not like 'TIMESTAMP%'
group by owner, table_name;

дб <> скрипка

...