是否可以描述一个表并首先显示NOTNULL列?

时间:2015-04-16 09:26:44

标签: sql oracle

我不能使用ORDER BY和DESC, 还有其他方法吗?

4 个答案:

答案 0 :(得分:2)

如果您只想要列的列表,可以使用_TAB_COLS视图和ORDER BY NULLABLE:

select table_name, column_name, data_type, nullable 
from user_tab_cols
where table_name = 'MYTABLE'
order by nullable, column_name;

答案 1 :(得分:1)

你不能使用内置的describe命令来做到这一点,没有。但您可以构建自己的查询(如here),但在order-by子句中包含可空标志:

select column_name as "Column",
  case when nullable = 'N' then 'NOT NULL' end as "Null?",
  cast (data_type || case 
    when data_type in ('VARCHAR2', 'CHAR', 'TIMESTAMP')
      then '(' || data_length || ')'
    when data_type in ('NUMBER')
        and (data_precision is not null or data_scale is not null)
      then '(' || data_precision || case
        when data_scale > 0 then ',' || data_scale
      end || ')'
    end as varchar2(30)) as "Type"
  from user_tab_columns
 where table_name = 'YOUR_TABLE'
 order by nullable, column_id;

使用以下代码创建表:

create table t42 (id number primary key, col1 varchar2(10),
  col2 number(10,3) not null, col3 date);

该查询会给你:

Column                         Null?    Type                         
------------------------------ -------- ------------------------------
ID                             NOT NULL NUMBER                        
COL2                           NOT NULL NUMBER(10,3)                  
COL1                                    VARCHAR2(10)                  
COL3                                    DATE                          

如果你要经常使用它,你可以使它成为一个流水线函数,你可以传递一个表名。但是,这不会解决同义词或描述存储的程序。

答案 2 :(得分:0)

为了向您澄清,因为您似乎不清楚这一点:DESC不是SQL命令 - 它由Oracle提供,作为SQL * Plus的一部分或您正在使用的任何Oracle实用程序。这就是没有ORDER BY的原因。它有自己的语法,例如,here

答案 3 :(得分:-1)

是的,您可以查询all_tab_columns

select *
from ALL_TAB_COLUMNS where nullable = 'N' and table_name = '<TABLE NAME>';