【问题标题】:Oracle - comparing default value of a columnOracle - 比较列的默认值
【发布时间】:2013-04-10 06:09:44
【问题描述】:

我正在尝试识别默认值为 NULL 或未设置默认值的数据库列。为此,我正在执行类似的查询..

SELECT T.TABLE_NAME,CL.COLUMN_NAME,CL.DATA_DEFAULT

    FROM   SYS.USER_TABLES T
               JOIN SYS.USER_TAB_COLUMNS CL ON T.TABLE_NAME = CL.TABLE_NAME

    WHERE  CL.DATA_DEFAULT IS NULL

    ORDER  BY t.table_name

在此查询的输出中,我得到了未设置默认值(空)的列,但我没有得到默认值为 NULL 的列

【问题讨论】:

  • 如果列是nullable 并且没有设置其他默认值,那么NULL 将是默认值。见SYS.USER_TAB_COLUMNS.NULLABLE

标签: sql oracle


【解决方案1】:

您也可以尝试以下查询 -

WITH xml AS (
         SELECT XMLTYPE(
                    DBMS_XMLGEN.GETXML('SELECT table_name, column_name ,DATA_DEFAULT FROM user_tab_cols')
                    ) AS xml
          FROM   dual
          )
SELECT * FROM ( 
 SELECT extractValue(xs.object_value, '/ROW/TABLE_NAME')       AS table_name
  ,      extractValue(xs.object_value, '/ROW/COLUMN_NAME')      AS column_name
  ,      extractValue(xs.object_value, '/ROW/DATA_DEFAULT')  AS DATA_DEFAULT
  FROM   xml x
  ,      TABLE(XMLSEQUENCE(EXTRACT(x.xml, '/ROWSET/ROW'))) xs
  ) WHERE (DATA_DEFAULT IS NULL OR UPPER(DATA_DEFAULT) = 'NULL')
;

上面的查询存在一些问题,您需要花费更多时间才能获得结果,但您会得到预期的正确结果。

【讨论】:

  • +1 使用 DBMS_XMLGEN.GETXML 解决“长列问题”
【解决方案2】:

在 oracle 中(至少对于 11g),如果您不给列指定默认值,那就像给它null

See this example


更新感谢@pratik garg 评论,我现在明白您真正要求的是一种查询long 列的方法。
正如@PratikGrag 在定义defualt null 时所述,LONG 列DATA_DEFAULT 将包含“null”。

由于USER_TAB_COLUMNS没有可用的ROWID,我能想到的唯一方法就是使用PLSQL。

类似这样的:

BEGIN
FOR rec IN (SELECT T.TABLE_NAME,CL.COLUMN_NAME,CL.DATA_DEFAULT
    FROM   SYS.USER_TABLES T
               JOIN SYS.USER_TAB_COLUMNS CL ON T.TABLE_NAME = CL.TABLE_NAME
   ORDER  BY t.table_name) LOOP

  IF rec.DATA_DEFAULT = 'null' THEN
    dbms_output.put_line(rec.table_name || ' ' || rec.COLUMN_NAME);
  END IF;
END LOOP;
END;

【讨论】:

  • SQL Server 怎么样?
  • @Luv,我对 SQL SERVER 了解不多,但根据documentation 应该也是null
  • @A.B.Cade 如果您明确将默认值定义为 null,则 data_default(长)列会将 Null 存储为值,而不是空字符串。这就是为什么如果您的数据库中有这样的约束,那么这些列将不会显示在相关查询中
  • @A.B.Cade 在您的示例输出中,我没有看到表“A”的“a”列。我也不想这样。
  • @MKDoshi,一开始我并没有真正理解你的问题,现在我想我明白了。查看我的更新
【解决方案3】:

Empty 意味着 NULL 它是一回事......

【讨论】:

    【解决方案4】:

    有,

    SELECT T.TABLE_NAME,CL.COLUMN_NAME,CL.DATA_DEFAULT
    
    FROM   SYS.USER_TABLES T
               JOIN SYS.USER_TAB_COLUMNS CL ON T.TABLE_NAME = CL.TABLE_NAME
    
    WHERE  ( CL.DATA_DEFAULT IS NULL OR LENGTH(CL.DATA_DEFAULT || '') < 1 )
    
    ORDER  BY t.table_name
    

    【讨论】:

    • oracle中长度为0的字符串为null
    • 这将在 Length 函数 ORA - 00932 上给出错误。因为它需要 Char 或数字,而我们正在传递 Long char。
    猜你喜欢
    • 1970-01-01
    • 2013-01-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-09
    相关资源
    最近更新 更多