簡體   English   中英

如何基於列值從表中知道列名

[英]How to know the column name from a table based on the column values

我正在Informix中工作,我想知道是否有一種簡單的方法可以通過其可能的列值來了解tabname / colname。

例如:

table1

Register 1
==========
id        1
col1      3
col2      Y

Register 2
==========
id       2
col1     43
col2     X 

Register 3
==========
id       2
col1     0
col2     Z 

Register 4
==========
id       2
col1     23
col2     F 


table2

Register 1
==========
id        1
col1      X
col2      Y

Register 2
==========
id       2
col1     X
col2     X 

Register 3
==========
id       2
col1     Z
col2     Z 

Register 4
==========
id       2
col1     X
col2     X 


table3

Register 1
==========
id       1
col1   ASX

使用此數據庫,如果我想知道包含X,Y和Z的數據庫的名稱和它們的相關選項卡名稱(其他值)。

可能是這樣的:

select tabname, colname 
where ('X','Y','Z') in colnamevalues --this has been invented by me

這應該返回以下值:

table1.col2 
table2.col1
table2.col2

--Note that the columns fetched contains also other values 
--different from 'X', 'Y' and 'Z' but T didn't fix in this case 
--the whole list of values, only some of them

我曾詢問過其他問答,但他們都希望使用其他數據庫的某些功能,例如Oracle或SQL Server,但我不太了解它們。

您可以通過查詢systables來獲取數據庫中存在的所有表:

SELECT  tabname
FROM    systables
WHERE   tabtype = 'T'   --get only tables
        AND tabid > 99; --skip catalog tables

您可以將其加入syscolumns表以獲取列:

SELECT  t.tabname, c.colname
FROM    systables t
    INNER JOIN syscolumns c ON (c.tabid = t.tabid)
WHERE   t.tabtype = 'T' AND t.tabid > 99;

而且,如果您知道值的類型,甚至可以對其進行過濾。 如果您正在尋找“字符串”的示例:

SELECT  t.tabname, c.colname
FROM    systables t
    INNER JOIN syscolumns c ON (c.tabid = t.tabid)
WHERE   t.tabtype = 'T' AND t.tabid > 99
        AND MOD(c.coltype,256) IN (
            0,  --CHAR
            13, --VARCHAR
            15, --NCHAR
            16, --NVARCHAR
            40, --LVARCHAR
            43  --LVARCHAR
        );

下一個示例可行,但實際上應該對其進行優化和防彈,但可以讓您開始。

有空的時候,我會再看一遍,檢查可以優化的內容並進行一些錯誤處理。

另一種方法是編寫腳本,您正在運行什么操作系統

模式創建:

CREATE TABLE tab1(
    id      INT,
    col1    CHAR(3),
    col2    CHAR(3)
);

INSERT INTO tab1 VALUES (1, 3, 'Y');
INSERT INTO tab1 VALUES (2, 43, 'X');
INSERT INTO tab1 VALUES (2, 0, 'Z');
INSERT INTO tab1 VALUES (2, 23, 'F');

CREATE TABLE tab2(
    id      INT,
    col1    CHAR(3),
    col2    CHAR(3)
);

INSERT INTO tab2 VALUES (1, 'X', 'Y');
INSERT INTO tab2 VALUES (2, 'X', 'X');
INSERT INTO tab2 VALUES (2, 'Z', 'Z');
INSERT INTO tab2 VALUES (2, 'X', 'X');

CREATE TABLE tab3(
    id      INT,
    col1    CHAR(3)
);

INSERT INTO tab3 VALUES (1, 'ASX');

樣例功能:

CREATE FUNCTION get_columns()
    RETURNING LVARCHAR(257) AS col;

    DEFINE stmt     VARCHAR(255);
    DEFINE tab_name VARCHAR(128,0);
    DEFINE tab_id   INTEGER;
    DEFINE col_name VARCHAR(128,0);

    DEFINE o_tname VARCHAR(128,0);
    DEFINE o_cname VARCHAR(128,0);

    CREATE TEMP TABLE out_table(
        t_name VARCHAR(128,0),
        c_name VARCHAR(128,0)
    );

    CREATE TEMP TABLE tab_v (
        col1 VARCHAR(255)
    );

    INSERT INTO tab_v VALUES ('X');
    INSERT INTO tab_v VALUES ('Y');
    INSERT INTO tab_v VALUES ('Z');

    FOREACH tables FOR 
        SELECT  tabname, tabid
        INTO    tab_name, tab_id 
        FROM    systables 
        WHERE   tabid > 99 AND tabtype = 'T'

            FOREACH column FOR
                SELECT  colname
                INTO    col_name
                FROM    syscolumns
                WHERE   tabid = tab_id
                        AND MOD(coltype,256) IN (
                            0,  --CHAR
                            13, --VARCHAR
                            15, --NCHAR
                            16, --NVARCHAR
                            40, --LVARCHAR
                            43  --LVARCHAR
                )

                    LET stmt = "INSERT INTO out_table "||
                                "SELECT '"||tab_name||"', '"||col_name||"' "||
                                "FROM "||tab_name||" "||
                                "WHERE EXISTS (SELECT 1 FROM tab_v v WHERE v.col1 = "||col_name||");";

                    EXECUTE IMMEDIATE stmt;
            END FOREACH
    END FOREACH

    FOREACH out FOR
        SELECT  UNIQUE t_name, c_name
        INTO    o_tname, o_cname
        FROM    out_table
            RETURN o_tname||"."||o_cname WITH RESUME;
    END FOREACH

    DROP TABLE out_table;
    DROP TABLE tab_v;
END FUNCTION;

EXECUTE FUNCTION get_columns();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM