2017-02-22 13 views
0

ビューを介してクエリを実行するときにSQLiteでフィールド名の完全修飾を無効にする方法が見つかりません。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 

セットアップを(...テーブルの命名は、他の試験からの症状である、mtcarsを笑うしないでください)今までのすべての正常。ビューを作成して使用する:

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

はい、これは私が気づいた1つの回避策です。もっと頑強な回避策ではないにしても「理由」を見つけたので、私は答えを書いています。返信ありがとう! – 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)。どちらも非推奨です。

返される列(上記のプラグマリンクで言い換え、フルテキスト)を命名するために使用されるロジックによると:AS句がある場合は

  1. は、それを使用します。
  2. 式の場合は、それを使用します。
  3. がtrueの場合は、列名のみを使用してください。
  4. *_column_namesが両方ともfalseの場合、ルール2が適用されます。
  5. 使用このインストールのTABLE.COLUMN

事実:2つのプラグマは、(落胆はあるが)使用可能と有効になるよう

  • pragma compile_optionsは、OMIT_DEPRECATEDは表示されません。
  • がtrueの場合、full_column_namesはfalseです(どちらも変更しません)。このことから

、私はSQLiteのは、表現としてエイリアスVIEW名とカラム名を処理しているため、ケース2で解決、決してケース3内または超えたプラグマをチェックされていることを推測しています。

私が(@答えたところで答えた)解決策は、明示的に各変数(select foo.mpg as mpg, foo.cyl as cyl ...)の名​​前を付けることです。これはロジックの根本的な欠陥ではなく症状を修正するように思えますが、SQLコードのベストプラクティス()の1つと常に一致しています()。

関連する問題