在查询视图时,我找不到如何在SQLite中禁用字段名称的完全限定。 (不要嘲笑mtcars
,表格命名是其他测试的症状......)
设置:
sqlite> create table mtcars (id int, mpg real, cyl int, vs int);
sqlite> insert into mtcars values (1, 21.0, 6, 0);
sqlite> insert into mtcars values (2, 22.8, 4, 1);
sqlite> insert into mtcars values (1, 21.4, 6, 1);
sqlite> .headers on
“正常”表访问,没有视图:
sqlite> select * from mtcars foo;
id|mpg|cyl|vs
1|21.0|6|0
2|22.8|4|1
1|21.4|6|1
sqlite> select foo.* from mtcars foo;
id|mpg|cyl|vs
1|21.0|6|0
2|22.8|4|1
1|21.4|6|1
sqlite> select foo.mpg,foo.cyl from mtcars foo;
mpg|cyl
21.0|6
22.8|4
21.4|6
到目前为止一切正常。创建和使用视图:
sqlite> create view vwmtcars as select mpg,cyl from mtcars;
sqlite> select * from vwmtcars foo;
mpg|cyl
21.0|6
22.8|4
21.4|6
sqlite> select foo.* from vwmtcars foo;
mpg|cyl
21.0|6
22.8|4
21.4|6
还是正常的。但是:
sqlite> select foo.mpg,foo.cyl from vwmtcars foo;
foo.mpg|foo.cyl
21.0|6
22.8|4
21.4|6
我期待mpg|cyl
,而不是foo.mpg|foo.cyl
。
两个问题:
(Win10 x64,sqlite3 3.14.2(包含在Git-for-Windows 2.11.1中))
答案 0 :(得分:2)
解决方法只是使用别名重置列名:
select f.mpg as mpg,f.cyl as cyl from vwmtcars f;
mpg|cyl
21.0|6
22.8|4
21.4|6
答案 1 :(得分:1)
进一步解释,以供将来参考。
SQLite's Pragmas中的两个是相关的:short_column_names
(目前设为1
)和full_column_names
(当前为0
)。两者都被弃用了。
根据命名返回列的逻辑(上述pragma链接中的释义,全文):
AS
子句,请使用它。short_column_names
为真,请仅使用列名。*_column_names
均为假,则适用规则2. TABLE.COLUMN
此安装的事实:
pragma compile_options
未列出OMIT_DEPRECATED
,因此这两个pragma可用且有效(尽管不鼓励); short_column_names
是真的,full_column_names
是假的(我没有改变过); 由此,我推断SQLite将别名的VIEW和列名称视为表达式,因此在案例2中解析并且从不检查案例3或更高版本中的编译指示。< / p>
我倾向于采用的解决方案(正如@gregory刚刚回答的那样)是明确命名每个变量(select foo.mpg as mpg, foo.cyl as cyl ...
)。虽然这似乎是修复症状而不是逻辑中的潜在缺陷,但它与SQL代码中的一个(很多)最佳实践一致:始终是明确的。