我正在使用SQLite3 in .cpp
,我正在使用std::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 :我正在丢弃它们,当我配对列地图时,仍然......我想知道这是否正确...... < / p>
PPS :在sqlite3库和Navicat客户端都会发生。
快速解决方案:3.7.14已损坏。将您的客户端更新为新版本!替换第三方软件中的DLL(但保留备份副本以防万一)也存在此问题。
答案 0 :(得分: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
来定义别名。
访问列的最可靠方法是使用索引,从而避免公式或重复列名称的问题。