2017-02-22 32 views
0

我無法找到如何在通過視圖查詢時禁用SQLite中字段名稱的完全限定。 (請勿mtcars笑,表的命名是從其他測試的症狀...)sqlite是在視圖中完全限定字段名稱

的設置:

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. 我可以禁用它嗎?

(Win10 x64上,sqlite3的3.14.2(如包含在Git中換的Windows 2.11.1))

回答

2

一種解決方法是隻需列名與別名復位:

select f.mpg as mpg,f.cyl as cyl from vwmtcars f; 
mpg|cyl 
21.0|6 
22.8|4 
21.4|6 
+0

是的,這正是我想到的一種解決方法。我正在起草一個答案,因爲我發現了「爲什麼」的原因,如果不是一個更強大的解決方法。感謝回覆! – r2evans

+0

似乎這種行爲是在通量:http://sqlite.1065341.n5.nabble.com/Aliasing-and-columns-names-td14489.html – gregory

+0

從2008年的「不斷變化」,緩慢的話語:-)我看到一些其他類似的討論,看來我也看到了類似的行爲。也許我只是重申永遠是明確的「最佳實踐」。再次感謝! – r2evans

1

進一步解釋,供將來參考。

SQLite's Pragmas有兩個是相關的:(當前設置爲1)和full_column_names(目前0)。兩者都被棄用。

根據用於命名返回的列中的邏輯(轉述,在上面的編譯鏈接全文):

  1. 如果存在AS子句,使用它。
  2. 如果是表達式,請使用它。
  3. 如果爲true,則只使用列名稱。
  4. 如果兩個*_column_names都是錯誤的,則適用規則2。
  5. 使用TABLE.COLUMN

事實此安裝:

  • pragma compile_options沒有列出OMIT_DEPRECATED,所以兩個編譯指示是可用的和有效的(雖然灰心);
  • 爲真,full_column_names爲假(我都沒有改變);

由此看來,我推斷SQLite是作爲表達治療別名VIEW和列名,因此在情況2得到解決,在情況3或超出從未檢查的編譯指示。

我傾向於的解決方案(就像@gregory剛剛回答的那樣)是明確命名每個變量(select foo.mpg as mpg, foo.cyl as cyl ...)。儘管這似乎是修復了症狀而不是邏輯中的底層缺陷,但它與SQL代碼中的一個(許多)最佳實踐一致:始終是明確的

相關問題