我需要从表中选择 50 个字段。但是第20个字段必须除以100。如果不是这样,我可以简单地写select * from table。在这种情况下,我如何选择而不必编写所有列。
明确提及所有列是一个好习惯,但是当我想快速查看数据以进行简短分析时,我更喜欢 select *(1-19 fields) , 20th field/100 , *(21- 50 个字段)来自表。
这在oracle中可能吗?
开发 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
不,如果输入所有列的工作量太大,请使用 SQLDEVELOPER 之类的工具,它允许您将表拖到编辑区域并为您提供完整的选择语句。
此外,最好明确说明列名。如果由于某种原因表更改并且删除了列,您的查询将停止工作。
数据字典是你的朋友:
select column_name || ','
from all_tab_columns
where table_name = 'SOME_TABLE'
and owner = 'SOME_OWNER'
order by column_id;
在您的 IDE 中运行它并将结果复制/粘贴到您的代码中。当然根据需要进行修改以满足您的输出需求。
不要偷懒,我知道说选择 * 很诱人,但是明确指定列要好得多。与手动写出每一列相比,上面的代码将减少痛苦。
您当然不希望在您希望显式列出列名的生产代码中执行此操作。您可能希望将计算放在一个函数中,或者将整个查询放在一个视图中。但是如果你只是做一些快速的分析,你可以很容易地将计算列放在列列表的开头(或结尾),如下所示
SELECT column20/100 computed_col20, a.*
FROM table_name a
您可以只写每列的名称,并在第 20 列写“column/20”。可能看起来工作量很大,但我没有看到任何其他方式。