此问题已在此处有答案:
Can you SELECT everything, but 1 or 2 fields, without writer's cramp?(12个回答)
7天前关闭
我有一张table像;
| ID|姓名|年份|pl_out(xml)|
| - -----|- -----|- -----|- -----|
| 1|伊万|一九八九年|xx|
| 2|佩普|一九九七年|xx|
当我尝试“select * from my_table”查询需要很长时间,因为巨大的pl_out列。
我不喜欢“从我的表中选择ID,姓名,年份”的方式。也许有时我的表会有很多列。
那么我如何从没有特定列名数据库表中获取数据呢?有什么办法吗?
比如“select * from my_table where column_name!='pl_out'“
it dosent work([Error] Execution(9:67):ORA-00904:“COLUMN_NAME”:无效标识符)
谢谢!
我试着从没有特定列名的db表中获取数据
3条答案
按热度按时间bnlyeluc1#
如何从没有特定列名的数据库表中获取数据?
将列设为
INVISIBLE
,则它将从SELECT * FROM table_name;
中排除,但如果显式命名它,您仍然可以选择它。例如:
然后:
输出:
| ID|名称|年份|
| - -----|- -----|- -----|
| 1|爱丽丝|一九○ ○年|
并且:
输出:
| ID|名称|年份|PL_OUT|
| - -----|- -----|- -----|- -----|
| 1|爱丽丝|一九○ ○年|一个你不想要的大专栏。|
fiddle
mm5n2pyu2#
您可以创建自18c起可用的多态表函数,该函数将跳过您指定的列。
注意:
在非常有限的情况下应谨慎使用这种方法,因为显式比隐式更好。指定star(
*
)来指定您想要的所有内容,或者指定您想要指定的列。除了一些列之外,其他的都可以作为数据转换的中间步骤,在这些步骤中,您可以在转换中定义这些额外的列(例如,像
unpivot
中那样,通过调整几个列来合并两个CTE)。否则,您无法知道未来,也无法保证表中的新列是您真正想要/期望的列:除了一个之外的所有意味着整个宇宙中的一切,除了这个特定的实体。PTF实现在以下代码中:
测试功能:
fiddle
或者从19.7开始使用SQL宏(似乎从21c开始使用
DBMS_TF
参数,但我没有19.7来测试)。fiddle
unhi4e5o3#
由于您有许多表需要排除某些列,因此您可以定义并存储这些表和表中的排除项。下面是这样一个表的示例(我将其命名为SQL_EXEC),显示了三种不同类型的列排除。SQL_SELECT列稍后将使用函数进行更新。下面是SQL_EXEC表:
| 所有者名称|表名|EXCL_类型|EXCL_瓦尔|SQL_SELECT|
| - -----|- -----|- -----|- -----|- -----|
| 您的_所有者|测试|数据类型|CLOB||
| 您的_所有者|测试|数据长度|四千||
| 您的_所有者|测试|列名称|PL_OUT||
为特定排除生成SQL Select语句的函数可能如下所示:
在SQL_EXEC表中有了数据之后,可以使用函数更新SQL_SELECT列。作为一个样本,我用它在测试表。
| ID| A_NAME| A_年|PL_OUT|
| - -----|- -----|- -----|- -----|
| 1|伊万|一九八九年|xx|
| 2|佩普|一九九七年|xx|
这将使用从PL_OUT列的三个不同排除项派生的相同select语句更新所有三行。
这可以进一步逐个使用或以动态方式循环使用。