我需要从表格中选择50个字段。但是第20个字段必须除以100.如果不是这样,我可以简单地从表中编写select *。在这种情况下,我怎么能选择而不必写所有列。
明确提及所有列是一个好习惯,但是当我想快速查看数据以进行简短分析时,我更喜欢像 选择*(1-19个字段) ,第20场/ 100 ,*(21-50个字段) 从表。
在oracle中这可能吗?
答案 0 :(得分:2)
开发SQL的最佳工具之一是具有列编辑模式的体面文本编辑器。 SQL Developer提供了一个增强请求,但同时Notepad ++是一个不错的选择。
对于这样的任务,您可以通过DESC获取表或视图的列名,使用基于列的编辑器添加对齐的逗号,并修改您需要的一列。
如果您需要,例如,在大多数列上应用计数并添加列名称,这也很方便。
以下示例大约需要45秒:
select
OWNER ,
count(TABLE_NAME ) c_TABLE_NAME ,
count(TABLESPACE_NAME ) c_TABLESPACE_NAME ,
count(CLUSTER_NAME ) c_CLUSTER_NAME ,
count(IOT_NAME ) c_IOT_NAME ,
count(STATUS ) c_STATUS ,
count(PCT_FREE ) c_PCT_FREE ,
count(PCT_USED ) c_PCT_USED ,
count(INI_TRANS ) c_INI_TRANS ,
count(MAX_TRANS ) c_MAX_TRANS ,
count(INITIAL_EXTENT ) c_INITIAL_EXTENT ,
count(NEXT_EXTENT ) c_NEXT_EXTENT ,
count(MIN_EXTENTS ) c_MIN_EXTENTS ,
count(MAX_EXTENTS ) c_MAX_EXTENTS ,
count(PCT_INCREASE ) c_PCT_INCREASE ,
count(FREELISTS ) c_FREELISTS ,
count(FREELIST_GROUPS ) c_FREELIST_GROUPS ,
count(LOGGING ) c_LOGGING ,
count(BACKED_UP ) c_BACKED_UP ,
count(NUM_ROWS ) c_NUM_ROWS ,
count(BLOCKS ) c_BLOCKS ,
count(EMPTY_BLOCKS ) c_EMPTY_BLOCKS ,
count(AVG_SPACE ) c_AVG_SPACE ,
count(CHAIN_CNT ) c_CHAIN_CNT ,
count(AVG_ROW_LEN ) c_AVG_ROW_LEN ,
count(AVG_SPACE_FREELIST_BLOCKS) c_AVG_SPACE_FREELIST_BLOCKS ,
count(NUM_FREELIST_BLOCKS ) c_NUM_FREELIST_BLOCKS ,
count(DEGREE ) c_DEGREE ,
count(INSTANCES ) c_INSTANCES ,
count(CACHE ) c_CACHE ,
count(TABLE_LOCK ) c_TABLE_LOCK ,
count(SAMPLE_SIZE ) c_SAMPLE_SIZE ,
count(LAST_ANALYZED ) c_LAST_ANALYZED ,
count(PARTITIONED ) c_PARTITIONED ,
count(IOT_TYPE ) c_IOT_TYPE ,
count(TEMPORARY ) c_TEMPORARY ,
count(SECONDARY ) c_SECONDARY ,
count(NESTED ) c_NESTED ,
count(BUFFER_POOL ) c_BUFFER_POOL ,
count(ROW_MOVEMENT ) c_ROW_MOVEMENT ,
count(GLOBAL_STATS ) c_GLOBAL_STATS ,
count(USER_STATS ) c_USER_STATS ,
count(DURATION ) c_DURATION ,
count(SKIP_CORRUPT ) c_SKIP_CORRUPT ,
count(MONITORING ) c_MONITORING ,
count(CLUSTER_OWNER ) c_CLUSTER_OWNER ,
count(DEPENDENCIES ) c_DEPENDENCIES ,
count(COMPRESSION ) c_COMPRESSION ,
count(DROPPED ) c_DROPPED
from dba_tables
group by owner
答案 1 :(得分:1)
不,如果输入所有列太多工作,请使用SQLDEVELOPER等工具,它允许您将表拖到编辑区域,并为您提供完整的选择语句。
此外,最好明确说明列名。如果由于某种原因,表格发生了变化并且列被删除,则查询将停止工作。
答案 2 :(得分:1)
数据字典是你的朋友:
select column_name || ','
from all_tab_columns
where table_name = 'SOME_TABLE'
and owner = 'SOME_OWNER'
order by column_id;
在IDE中运行它并将结果复制/粘贴到您的代码中。当然需要修改以满足您的输出需求。
不要偷懒,我知道选择*会很诱人,但明确指定列要好得多。上面的代码比手写出每一列更容易让人痛苦。
答案 3 :(得分:1)
您当然不希望在要显式列出列名的生产代码中执行此操作。而且您可能想要将计算放在函数中或将整个查询放在视图中。但是,如果您只是进行一些快速的分析,您可以轻松地将计算列放在列列表的开头(或结尾),如下所示
SELECT column20/100 computed_col20, a.*
FROM table_name a
答案 4 :(得分:0)
你可以写下每一列的名称,在第20栏中写下“column / 20”。可能看起来很多工作,但我没有看到任何其他方式。