0

我正在使用SQLite3 in .cpp并且正在使用 astd::map<std::string, special_variant_type>来存储行。一切都很好,但我发现当我SELECT(subqueries).

比较这些查询:

SELECT `name` FROM `sqlite_master` WHERE `type`='table'; // works as I expected

(选择任何一个)

// do not work as I expected but might work as expected...
SELECT `name` FROM (SELECT `name` FROM `sqlite_master` WHERE `type`='table');
SELECT [name] FROM (SELECT `name` FROM `sqlite_master` WHERE `type`='table');

问题:第一个带来未修饰的列名。所以,列名是name。对于从子查询中选择的第二个,列名保持不变。返回backticks, square brackets [], double quotes "......任何应该是...... IMO的名称包装器,被丢弃。

这是预期的行为吗?似乎不一致,要么保留包装器,要么丢弃它们......

PS我现在在配对列映射时丢弃它们,仍然......我想知道这是否正确......

PPS它发生在 sqlite3 库和 Navicat 客户端中。

快速解决方案:3.7.14 已损坏。将您的客户端更新到新版本!替换第 3 方软件中也存在此问题的 DLL(但保留备份副本以防万一)。

4

1 回答 1

0

似乎是一致的:

$ sqlite3
SQLite version 3.7.15.2 2013-01-09 11:53:05
Enter ".help" for instructions
Enter SQL statements terminated with a ";"
sqlite> create table test(x);
sqlite> .headers on
sqlite> .mode columns
sqlite> SELECT `name` FROM `sqlite_master` WHERE `type`='table';
name
----------
test
sqlite> SELECT `name` FROM (SELECT `name` FROM `sqlite_master` WHERE `type`='table');
name
----------
test

无论如何,SQLite 不保证列名。

要在结果中强制使用列名,请使用AS定义别名。

访问列最可靠的方法是通过索引,从而避免公式问题或重复列名。

于 2013-03-15T09:04:20.910 回答