Как получить типы столбцов SQLite из столбцов представления - PullRequest
0 голосов
/ 01 февраля 2019

При определении вида следующим образом:

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 ]

0 голосов
/ 01 февраля 2019

Я попробовал это

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

, но безуспешно.

Ответ не задокументирован в документации.Вы ссылаетесь здесь https://www.sqlite.org/datatype3.html?

  • 3.2 Сходство выражений: «... В противном случае выражение не имеет сходства».
  • 3.3 Сходство столбцов для представлений и подзапросов: ... "выражения всегда не имеют сходства".

На самом деле, ваш вопрос, вероятно, о том, что находится в информации таблицы / представления ине о сходстве типов (ни о типовых ограничениях).Мне кажется, что это чистое решение о реализации в SQLite3, чтобы не устанавливать информацию о представлении для чего-либо, кроме предопределенных атрибутов в CREATE VIEW.

0 голосов
/ 01 февраля 2019

Обходной путь при использовании клиента, такого как 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...