sql - 是否可以使用模式匹配从 Oracle SQL 数据库中选择列?
问题描述
我在 Oracle SQL DB 中有一个表,其中包含带有“PERCENT_”等标题的列以及其他名称。我想选择所有带有“PERCENT_”前缀的列。
我已经找到了一些可以回答问题的问题,例如如何在数据库中查找具有与某些模式匹配的列的所有表……但似乎没有一个可以回答这个特定问题。
这可以做到吗?我能够返回与“all_tab_columns”匹配的所有列名的列表
select column_name from all_tab_columns where column_name like 'PERCENT_%' from <table_name>
但是我可以做这样的事情来从我想要的表中选择那些列吗?
with desired_cols as (select column_name from all_tab_columns where column_name like 'PERCENT_%' from <table_name>)
select desired_cols from <table_name>
解决方案
SQL 查询总是返回一组固定的、预定义的列。您所要求的需要动态 SQL:也就是说,运行一个收集列名的查询,将结果保存在一个变量中,并使用它来构建要执行的实际查询。
如果这是一次性查询,那么我建议只运行以下查询:
select 'select '
|| listagg('"' || column_name || '"', ', ') within group (order by column_id)
|| ' from mytable' as sql_query
from all_tab_columns
where owner = 'MYSCHEMA' and table_name = 'MYTABLE' and column_name like 'PERCENT_%';
这会生成您想要的查询,然后您可以复制/粘贴并独立运行。
请注意,我在模式名称上添加了一个过滤器(这是唯一标识数据库中的表所必需的)。我还按列在表中的位置对列进行了排序。
另一方面,如果您想要完全动态的东西,那么您可以例如构建一个函数,该函数将返回一个保存查询结果的游标。
create function myfunction return sys_refcursor
as
v_sql varchar(1000);
v_cursor sys_refcursor;
begin
select 'select '
|| listagg('"' || column_name || '"', ', ') within group (order by column_id)
|| ' from mytable' as sql_query
into v_sql
from all_tab_columns
where table_name = 'MYTABLE' and column_name like 'PERCENT_%';
open v_cursor for v_sql;
return v_cursor;
end;
/
然后,您必须决定如何使用光标。
推荐阅读
- android - 未通过 Intune 部署的 Android 业务线应用
- javascript - 在 React 上,如何在功能/无状态组件上调用组件挂载的函数?
- python - pyqt 动画导致对象部分消失
- node.js - 如何在 Node.js 中的 azure 活动目录上使用登录用户获取令牌
- c# - '无法将 MySQL 日期/时间值转换为 System.DateTime' 不使用日期 - C#.Net
- php - 为什么当我从本地主机 ping 一个 IP 时 cURL 可以工作,但当我从 000webhostapp 使用它时却不行?
- android - Gradle离线同步问题
- node.js - 续集,日期返回为 1 天加
- android - Android 的 StrictMode 惩罚监听器给出 NoClassDefFoundError
- python - 将 _doc 类型与 elasticsearch-dsl-py 一起使用