管理 xmlagg 的空值
Manage null values of xmlagg
我有以下结构的查询:
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 或时间戳类型时,这会给我输出:
SELECT , , third_col, , fifth_col, from schema.table;
如何修改查询使其提供:
SELECT third_col, fifth_col from schema.table;
生成的 select 语句作为一行进一步存储在 spark 数据框中(我使用的是 Scala)。因此,如果我们可以通过正则表达式修改查询或替换子字符串,那也可以解决问题,我也愿意接受这些建议,但如果我不必以这种方式侵入它并进行管理,我将不胜感激在查询端本身。
我认为你过于复杂了;只是根本不包括这些列,通过在 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
)
然后您可以删除 case 表达式。
你也可以稍微简化一下:
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;
我有以下结构的查询:
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 或时间戳类型时,这会给我输出:
SELECT , , third_col, , fifth_col, from schema.table;
如何修改查询使其提供:
SELECT third_col, fifth_col from schema.table;
生成的 select 语句作为一行进一步存储在 spark 数据框中(我使用的是 Scala)。因此,如果我们可以通过正则表达式修改查询或替换子字符串,那也可以解决问题,我也愿意接受这些建议,但如果我不必以这种方式侵入它并进行管理,我将不胜感激在查询端本身。
我认为你过于复杂了;只是根本不包括这些列,通过在 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
)
然后您可以删除 case 表达式。
你也可以稍微简化一下:
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;