sqlite是视图中的完全限定字段名称

时间:2017-02-22 02:13:30

标签: sqlite sql-view

在查询视图时,我找不到如何在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

两个问题:

  1. 为什么字段名称是完全合格的?
  2. 我可以禁用此功能吗?
  3. (Win10 x64,sqlite3 3.14.2(包含在Git-for-Windows 2.11.1中))

2 个答案:

答案 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链接中的释义,全文):

  1. 如果有AS子句,请使用它。
  2. 如果是表达式,请使用它。
  3. 如果short_column_names为真,请仅使用列名。
  4. 如果*_column_names均为假,则适用规则2.
  5. 使用TABLE.COLUMN
  6. 此安装的事实:

    • 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代码中的一个(很多)最佳实践一致:始终是明确的