1

我需要从表中选择 50 个字段。但是第20个字段必须除以100。如果不是这样,我可以简单地写select * from table。在这种情况下,我如何选择而不必编写所有列。

明确提及所有列是一个好习惯,但是当我想快速查看数据以进行简短分析时,我更喜欢 select *(1-19 fields) , 20th field/100 , *(21- 50 个字段)来自表。

这在oracle中可能吗?

4

5 回答 5

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
于 2012-05-24T08:01:32.270 回答
1

不,如果输入所有列的工作量太大,请使用 SQLDEVELOPER 之类的工具,它允许您将表拖到编辑区域并为您提供完整的选择语句。

此外,最好明确说明列名。如果由于某种原因表更改并且删除了列,您的查询将停止工作。

于 2012-05-24T07:11:59.813 回答
1

数据字典是你的朋友:

select column_name || ','
from all_tab_columns
where table_name = 'SOME_TABLE'
and owner = 'SOME_OWNER'
order by column_id;

在您的 IDE 中运行它并将结果复制/粘贴到您的代码中。当然根据需要进行修改以满足您的输出需求。

不要偷懒,我知道说选择 * 很诱人,但是明确指定列要好得多。与手动写出每一列相比,上面的代码将减少痛苦。

于 2012-05-24T10:42:01.473 回答
1

您当然不希望在您希望显式列出列名的生产代码中执行此操作。您可能希望将计算放在一个函数中,或者将整个查询放在一个视图中。但是如果你只是做一些快速的分析,你可以很容易地将计算列放在列列表的开头(或结尾),如下所示

SELECT column20/100 computed_col20, a.*
  FROM table_name a
于 2012-05-27T07:04:12.720 回答
0

您可以只写每列的名称,并在第 20 列写“column/20”。可能看起来工作量很大,但我没有看到任何其他方式。

于 2012-05-24T07:10:08.753 回答