【问题标题】:Informix SQL - List all fields & tablesInformix SQL - 列出所有字段和表
【发布时间】:2010-11-25 17:33:16
【问题描述】:

Informix iSQL 有一个显示所有表的命令“info tables;”。
查看字段及其各自数据类型的语法为“info columns for table;

是否有类似的命令显示所有表和所有字段的 table.field?

【问题讨论】:

  • 如果您需要其他内容,请展开或澄清您的问题。
  • 不,这正是我想要的,而且我认识的人会提供!
  • +1 用于使用 Informix,尤其是“LEFFLER!!!! HELP!!!!” :D 他很棒! :)

标签: sql field informix isql


【解决方案1】:

使用首选的 JOIN 表示法:

SELECT TRIM(t.tabname) || '.' || TRIM(c.colname) AS table_dot_column
  FROM "informix".systables  AS t
  JOIN "informix".syscolumns AS c ON t.tabid = c.tabid
 WHERE t.tabtype = 'T'
   AND t.tabid >= 100
 ORDER BY t.tabname, c.colno;

或老式的 join-in-where-clause 表示法:

SELECT TRIM(t.tabname) || '.' || TRIM(c.colname) AS table_dot_column
  FROM "informix".systables AS t, "informix".syscolumns AS c
 WHERE t.tabid = c.tabid
   AND t.tabtype = 'T'
   AND t.tabid >= 100
 ORDER BY t.tabname, c.colno;

假设您使用的是最新版本的 IDS,您可以按选择列表中未引用的列进行排序。如果您收到投诉,请将排序列添加到选择列表中。

连接标准很明显; tabtype = 'T' 仅列出表,而不列出视图、同义词和 systables 中列出的其他此类项目; tabid >= 100 只列出在数据库中显式创建的表,而不是系统目录。

这不包括类型信息 - 如果你想要,你必须做更多的工作。您将找到一个文件$INFORMIXDIR/etc/xpg4_is.sql,其中包含对旧版本 XPG4(X/Open 标准)信息模式的粗略近似(因此是文件名)。在那里,有一些函数等可以将来自syscolumns.coltypesyscolumns.collength 的类型信息解码为可识别的字符串。但是,我强烈怀疑它不处理 DISTINCT 类型,也不处理其他用户定义的类型。我会很高兴被证明是错误的,但是...如果您将该文件的相关部分添加到您的数据库中,那么您也应该能够获得类型信息。

还要注意,ISQL 和 DB-Access 中的所有 INFO 命令都是在前端模拟的,而不是在 IDS 服务器中执行的。基本上,程序接受请求并将其转换为更复杂的 SQL 语句。请参阅文件sqlinfo.ec 中的代码,它是SQLCMD 的一部分(可从IIUG Software Archive 获得),了解我的SQLCMD 程序如何处理INFO 语句。 (注意:SQLCMD 的 INFO 输出格式与 ISQL 和 DB-Access 的 INFO 输出格式不同。)

【讨论】:

  • 如果在已经知道列名的情况下想知道表名,可以使用与c.colname ='COLUMNNAME'相同的where条件查询
【解决方案2】:

正如 Jonathan Leffer 的回答所提到的,如 SYSCOLUMNS 文档中所示,对列类型和列详细信息的完整处理变得复杂。但是,如果您正在查看不使用更复杂类型的数据库,那么在他的脚本中添加的这个将显示基本类型以及是否允许 NULL:

SELECT TRIM(t.tabname) || '.' || TRIM(c.colname) AS table_dot_column,
CASE 
  WHEN MOD(coltype,256)=0 THEN 'CHAR' 
  WHEN MOD(coltype,256)=1 THEN 'SMALLINT' 
  WHEN MOD(coltype,256)=2 THEN 'INTEGER' 
  WHEN MOD(coltype,256)=3 THEN 'FLOAT' 
  WHEN MOD(coltype,256)=4 THEN 'SMALLFLOAT' 
  WHEN MOD(coltype,256)=5 THEN 'DECIMAL' 
  WHEN MOD(coltype,256)=6 THEN 'SERIAL' 
  WHEN MOD(coltype,256)=7 THEN 'DATE' 
  WHEN MOD(coltype,256)=8 THEN 'MONEY' 
  WHEN MOD(coltype,256)=9 THEN 'NULL' 
  WHEN MOD(coltype,256)=10 THEN 'DATETIME' 
  WHEN MOD(coltype,256)=11 THEN 'BYTE' 
  WHEN MOD(coltype,256)=12 THEN 'TEXT' 
  WHEN MOD(coltype,256)=13 THEN 'VARCHAR' 
  WHEN MOD(coltype,256)=14 THEN 'INTERVAL' 
  WHEN MOD(coltype,256)=15 THEN 'NCHAR' 
  WHEN MOD(coltype,256)=16 THEN 'NVARCHAR' 
  WHEN MOD(coltype,256)=17 THEN 'INT8' 
  WHEN MOD(coltype,256)=18 THEN 'SERIAL8' 
  WHEN MOD(coltype,256)=19 THEN 'SET' 
  WHEN MOD(coltype,256)=20 THEN 'MULTISET' 
  WHEN MOD(coltype,256)=21 THEN 'LIST' 
  WHEN MOD(coltype,256)=22 THEN 'ROW (unnamed)' 
  WHEN MOD(coltype,256)=23 THEN 'COLLECTION' 
  WHEN MOD(coltype,256)=40 THEN 'LVARCHAR fixed-length opaque types' 
  WHEN MOD(coltype,256)=41 THEN 'BLOB, BOOLEAN, CLOB variable-length opaque types' 
  WHEN MOD(coltype,256)=43 THEN 'LVARCHAR (client-side only)' 
  WHEN MOD(coltype,256)=45 THEN 'BOOLEAN' 
  WHEN MOD(coltype,256)=52 THEN 'BIGINT' 
  WHEN MOD(coltype,256)=53 THEN 'BIGSERIAL' 
  WHEN MOD(coltype,256)=2061 THEN 'IDSSECURITYLABEL'
  WHEN MOD(coltype,256)=4118 THEN 'ROW (named)' 
  ELSE TO_CHAR(coltype)
END AS Type,
BITAND(coltype,256)=256 AS NotNull
  FROM "informix".systables  AS t
  JOIN "informix".syscolumns AS c ON t.tabid = c.tabid
 WHERE t.tabtype = 'T'
   AND t.tabid >= 100
 ORDER BY t.tabname, c.colno;

【讨论】:

    【解决方案3】:

    使用 syscolumns 表。此类信息在IBM Informix Guide to SQL中有所描述

    我已经完成了简单的 Python 实用程序,它显示了 InformixOraclePostgreSQL 的架构信息。如果您必须比较数据库,它们会很有用。

    【讨论】:

      【解决方案4】:

      我做了一个基本的补充来检查主键列。 还添加了列顺序、数据类型长度。 这给出了 ETL 生成的基本信息

      SELECT TRIM(t.tabname)  AS TableName
      ,c.colno                AS ColumnOrder
      ,TRIM(c.colname)        AS ColumnName
      ,CASE 
        WHEN MOD(coltype,256)=0 THEN 'CHAR' 
        WHEN MOD(coltype,256)=1 THEN 'SMALLINT' 
        WHEN MOD(coltype,256)=2 THEN 'INTEGER' 
        WHEN MOD(coltype,256)=3 THEN 'FLOAT' 
        WHEN MOD(coltype,256)=4 THEN 'SMALLFLOAT' 
        WHEN MOD(coltype,256)=5 THEN 'DECIMAL' 
        WHEN MOD(coltype,256)=6 THEN 'SERIAL' 
        WHEN MOD(coltype,256)=7 THEN 'DATE' 
        WHEN MOD(coltype,256)=8 THEN 'MONEY' 
        WHEN MOD(coltype,256)=9 THEN 'NULL' 
        WHEN MOD(coltype,256)=10 THEN 'DATETIME' 
        WHEN MOD(coltype,256)=11 THEN 'BYTE' 
        WHEN MOD(coltype,256)=12 THEN 'TEXT' 
        WHEN MOD(coltype,256)=13 THEN 'VARCHAR' 
        WHEN MOD(coltype,256)=14 THEN 'INTERVAL' 
        WHEN MOD(coltype,256)=15 THEN 'NCHAR' 
        WHEN MOD(coltype,256)=16 THEN 'NVARCHAR' 
        WHEN MOD(coltype,256)=17 THEN 'INT8' 
        WHEN MOD(coltype,256)=18 THEN 'SERIAL8' 
        WHEN MOD(coltype,256)=19 THEN 'SET' 
        WHEN MOD(coltype,256)=20 THEN 'MULTISET' 
        WHEN MOD(coltype,256)=21 THEN 'LIST' 
        WHEN MOD(coltype,256)=22 THEN 'ROW (unnamed)' 
        WHEN MOD(coltype,256)=23 THEN 'COLLECTION' 
        WHEN MOD(coltype,256)=40 THEN 'LVARCHAR fixed-length opaque types' 
        WHEN MOD(coltype,256)=41 THEN 'BLOB, BOOLEAN, CLOB variable-length opaque types' 
        WHEN MOD(coltype,256)=43 THEN 'LVARCHAR (client-side only)' 
        WHEN MOD(coltype,256)=45 THEN 'BOOLEAN' 
        WHEN MOD(coltype,256)=52 THEN 'BIGINT' 
        WHEN MOD(coltype,256)=53 THEN 'BIGSERIAL' 
        WHEN MOD(coltype,256)=2061 THEN 'IDSSECURITYLABEL'
        WHEN MOD(coltype,256)=4118 THEN 'ROW (named)' 
        ELSE TO_CHAR(coltype)
      END                     AS Datatype
      ,c.collength            AS DatatypeLength
      ,CASE WHEN NVL(
      (
          SELECT MAX(i.idxname)
          FROM "informix".sysconstraints cn inner join "informix".sysindexes i 
              on cn.idxname = i.idxname
              and cn.tabid = i.tabid
          where cn.constrtype = 'P'
              AND cn.tabid = t.tabid
              AND
              (c.colno = i.part1
              OR c.colno = i.part2
              OR c.colno = i.part3
              OR c.colno = i.part4
              OR c.colno = i.part5
              OR c.colno = i.part6
              OR c.colno = i.part7
              OR c.colno = i.part8
              OR c.colno = i.part9
              OR c.colno = i.part10
              OR c.colno = i.part11
              OR c.colno = i.part12
              OR c.colno = i.part13
              OR c.colno = i.part14
              OR c.colno = i.part15
              OR c.colno = i.part16
              )
      ),'') = '' THEN 0 ELSE 1 END    AS PK
      FROM "informix".systables  AS t  JOIN "informix".syscolumns AS c 
          ON t.tabid = c.tabid
      WHERE t.tabtype = 'T'
          AND t.tabid >= 100
          --AND t.tabname = 'resource'
      ORDER BY t.tabname, c.colno;
      
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-10-15
        • 2011-06-01
        • 1970-01-01
        • 1970-01-01
        • 2021-12-28
        • 2023-01-18
        • 1970-01-01
        相关资源
        最近更新 更多