代码之家  ›  专栏  ›  技术社区  ›  Lukas Eder

如何从视图列中获取SQLite列类型

  •  1
  • Lukas Eder  · 技术社区  · 7 年前

    定义这样的视图时:

    CREATE TABLE x (a VARCHAR(10));
    CREATE VIEW v AS SELECT a, a || ' ' AS b FROM x;
    

    PRAGMA table_info('v');
    

    不幸的是,这导致了

    cid |name |type        |notnull |dflt_value |pk |
    ----|-----|------------|--------|-----------|---|
    0   |a    |VARCHAR(10) |0       |           |0  |
    1   |b    |            |0       |           |0  |
    

    任何类型的列表达式都没有列类型。是否有不同的方法来定义视图和/或查询表信息以获取列类型,或者SQLite就是这样工作的 type affinity

    2 回复  |  直到 7 年前
        1
  •  1
  •   Stefan    7 年前

    我试过这个

    CREATE VIEW v2 AS SELECT a, CAST((a || ' ') AS VARCHAR(11)) AS b FROM x;
    

    也没有成功。

    答案没有记录在文档中吗。你在这里指的是什么 https://www.sqlite.org/datatype3.html

    • 3.3视图和子查询的列关联:。。。“表达总是没有亲和力”。

    事实上,您的问题可能是关于表/视图信息中的内容,而不是关于类型关联(或类型约束)。在我看来,在SQLite3中,这是一个纯粹的实现决策,即不为CREATE视图中预定义属性以外的任何内容设置视图信息。

        2
  •  0
  •   Lukas Eder    7 年前

    使用像JDBC这样的客户机(例如通过Xerial)时的一个解决方法是从视图中获取一行并检查 ResultSetMetaData

    try (Connection c = DriverManager.getConnection("jdbc:sqlite::memory:");
        Statement s = c.createStatement()) {
    
        s.execute("CREATE TABLE x (a VARCHAR(10));");
        s.execute("INSERT INTO x VALUES ('a')");
        s.execute("CREATE VIEW v AS SELECT a, a || ' ' AS b FROM x;");
    
        try (ResultSet rs = s.executeQuery("SELECT * FROM v LIMIT 1")) {
            ResultSetMetaData meta = rs.getMetaData();
    
            for (int i = 0; i < meta.getColumnCount(); i++) {
                String name = meta.getColumnName(i + 1);
                String type = meta.getColumnTypeName(i + 1);
                int precision = meta.getPrecision(i + 1);
                System.out.println(name + " " 
                                 + type 
                                 + (precision > 0 ? " (" + precision + ")" : ""));
            }
        }
    }
    

    这将产生:

    a VARCHAR (10)
    b TEXT
    

    但是,如果视图不生成任何行,并且列类型再次未知,则此操作不起作用:

    a VARCHAR (10)
    b NULL
    
    推荐文章