SQLite3:从(子查询)中选择时列名中的意外包装

时间:2013-03-14 18:18:47

标签: sqlite

我正在使用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(但保留备份副本以防万一)也存在此问题。

1 个答案:

答案 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来定义别名。

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