2017-02-22 1 views
0

Je ne trouve pas comment désactiver la qualification complète des noms de champ dans SQLite lors de l'interrogation via une vue. (Ne riez pas mtcars, dénomination de table est un symptôme d'autres tests ...)sqlite est des noms de champs entièrement qualifiants dans les vues

La configuration:

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 

accès à la table "Normal", aucune vue:

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 

Tout à fait normal jusqu'à présent. Créer et utiliser une vue:

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 

Toujours normal. Cependant:

sqlite> select foo.mpg,foo.cyl from vwmtcars foo; 
foo.mpg|foo.cyl 
21.0|6 
22.8|4 
21.4|6 

Je me attendais mpg|cyl, pas foo.mpg|foo.cyl.

Deux questions:

  1. Pourquoi les noms de champ étant complet qualifié? Est-ce que je peux le désactiver?

(Win10 x64, sqlite3 3.14.2 (comme inclus dans Git-for Windows 2.11.1))

Répondre

2

Une solution est juste pour réinitialiser les noms de colonnes avec des alias:

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

Oui, c'est exactement une solution de contournement que j'avais en tête. Je suis en train de rédiger une réponse, car j'ai trouvé le «pourquoi», sinon une solution de contournement plus robuste. Merci d'avoir répondu! – r2evans

+0

On dirait que ce comportement est en cours: http://sqlite.1065341.n5.nabble.com/Aliasing-and-columns-names-td14489.html – gregory

+0

"En flux" à partir de 2008, discours lent :-) J'en ai vu d'autres discussions comme ça, et il semble que je vois un comportement similaire. Peut-être que je ne fais que réaffirmer une «meilleure pratique» d'être toujours explicite. Merci encore! – r2evans

1

En outre expliqué, pour référence future.

Deux SQLite's Pragmas sont pertinents: (actuellement à 1) et full_column_names (actuellement 0). Les deux sont obsolètes.

Selon la logique utilisée pour nommer les colonnes renvoyées (paraphrasé, texte intégral dans le lien ci-dessus pragma):

  1. S'il y a une clause AS, utilisez-le.
  2. S'il s'agit d'une expression, utilisez-la.
  3. Si est true, utilisez uniquement le nom de la colonne.
  4. Si les deux *_column_names sont faux, la règle 2 s'applique.
  5. Utilisez TABLE.COLUMN

pour cette installation Faits:

  • pragma compile_options ne liste pas OMIT_DEPRECATED, de sorte que les deux pragmas sont utilisables et valides (quoique découragée); Est vrai, full_column_names est faux

De là, je suis inférant que SQLite traite les noms crénelage VIEW et colonne comme une expression , étant donc résolu dans le cas 2 et de ne jamais vérifier les pragmas en cas 3 ou au-delà.

La solution vers laquelle je penche (comme @gregory vient de répondre) est de nommer explicitement chaque variable (select foo.mpg as mpg, foo.cyl as cyl ...). Et bien que cela semble réparer le symptôme et non la faille sous-jacente dans la logique, il est cohérent avec un (de beaucoup) les meilleures pratiques dans le code SQL: toujours être explicite.