2009-11-19 23 views
3

前提的SQLite列的别名

我最近遇到了一个错误,在我的代码select声明。在意识到发生了什么之后修复这个问题相当简单,但我有兴趣找到一种方法来确保类似的错误不会再发生。

下面是一个违规查询的例子:

select 
    the, 
    quick, 
    brown 
    fox, 
    jumped, 
    over, 
    the, 
    lazy, 
    dog 
from table_name; 

我本来打算是:

select 
    the, 
    quick, 
    brown, 
    fox, 
    jumped, 
    over, 
    the, 
    lazy, 
    dog 
from table_name; 

对于那些谁看不出来,一个逗号brown后的前失踪。这会导致该列被别名,因为as关键字是而不是必需的。所以,你在结果得到的是:

the, 
    quick, 
    fox, 
    jumped, 
    over, 
    the, 
    lazy, 
    dog 

......在一个名为fox列的brown所有值。这可以很容易地像上述(尤其是当每一列都有非常不同的值)短查询注意到,但它想出了是一个相当复杂的查询与大多整数列如下:

select 
    foo, 
    bar, 
    baz, 
    another_table.quux, 
    a1, 
    a2, 
    a3, 
    a4, 
    a5, 
    a6, 
    a7, 
    a8, 
    a9, 
    a10, 
    a11, 
    a12, 
    a13, 
    a14, 
    a15, 
    a16, 
    b1, 
    b2, 
    b3, 
    b7, 
    b8, 
    b9, 
    b10, 
    b11, 
    b12, 
    b13, 
    b14, 
    b18, 
    b19, 
    b20, 
    b21, 
    c1, 
    c2, 
    c3, 
    c4, 
    c5, 
    c6, 
    c7, 
    c8 
from table_name 
join another_table on table_name.foo_id = another_table.id 
where 
    blah = 'blargh' 
-- many other things here 
; 

即使具有更好的列名称,这些值都非常相似。如果我在b11(例如)之后错过逗号,然后所有b11值被调用b12,那么当我们通过处理管道(取决于结果中的这些列名称)运行数据时非常不幸。通常情况下,我会做select * from table_name,但我们需要的是要求我们选择一点。

问题

我正在寻找的是一个战略,以再次阻止这种情况发生。

有没有办法在别名列时需要as?或者写一些东西让它出错? (例如,在C的语言,我开始写1 == foo代替foo == 1引起编译错误时我意外地留出一个等号,使其成为无效1 = foo代替foo = 1。)

我使用vim通常,所以我可以使用hlsearch突出显示逗号,以便我可以看到它。但是,我必须经常在其他环境中编写查询,其中包括一个专有接口,在这个接口中我无法轻松完成这样的事情。

感谢您的帮助!

回答

6

我以前做过的一件事是将逗号移动到行的开头。这可以带来一些好处。首先,您可以立即查看是否缺少逗号。其次,您可以在最后添加一个新列,而无需修改以前的最后一行。

缺少:

select 
    the 
, quick 
, brown 
    fox 
, jumped 
, over 
, the 
, lazy 
, dog 
from table_name; 

不缺:

select 
    the 
, quick 
, brown 
, fox 
, jumped 
, over 
, the 
, lazy 
, dog 
from table_name; 
+0

我打算在我的问题中写下这个,实际上 - 但我想我会留下来看看人们是否有更好的建议。 任何方式允许它在'the'之前?或者那只是一个可以与之共存的东西? – 2009-11-19 16:56:51

+0

某些东西在收集的一端或另一端会有所不同。如果你急于在选择之后立即使用逗号,那么你可以在选择之后移动“the”,或者选择一个虚拟常量,比如“select 1”。 – scwagner 2009-11-19 16:59:41

+0

这一切都很好 - 我错过了一个逗号。我希望有一种总是有尾随逗号的方式,就像在Python或Ruby中一样。 (你可以写[1,2,3,4],然后这个问题就会消失,当你只想对第二个问题发表评论时,这是个好主意。) – 2009-11-19 17:03:25

0

名称

first 
,short 
,medium 
,longlonglong 
,... 

VS

first, 
short, 
medium, 
longlonglong, 
... 

也使得它可以很容易看到SQL的列表中选择参数之前写一个逗号

作品在任何IDE :)

-1

如果您有名称相似的列,只能通过后缀数字进行区分, ady输了。你有一个不好的数据库设计。

现在大多数开发人员使用SQL生成器或ORM,而不是编写这种“汇编语言”SQL。

+1

这件事情我来到的,不是我设计的所有权。绝对是我想改变的东西。 – 2009-11-19 16:54:17

+0

关于第二条评论,我通常使用ORM层。但是,仍然有很多复杂的情况,在这种情况下,编写一个succint'select'查询会胜过ORM。 – 2009-11-19 16:58:47

+0

我不是在责怪你。如果你还没有拥有它,我只是给你方向。 :) – 2009-11-21 02:24:55

1

你可以在一个功能包的SQL调用,要么:

  1. 遍历结果集中的列,检查包含空格的列名称

  • 同时接受SQL语句和列的整数预计数量,然后检查结果集,以确保列数相匹配你的原意。
  • 1

    我有和你一样的问题。我已经使用make和perl脚本来做一个“lint”,就像查看我的代码很长一段时间一样。它有助于防止这样的一些错误。 在生成文件中,我有:

    lint_code: 
        perl lint_code.pl <file_1.php 
    

    Perl的文件是:

    $st = 0; 
    $line_no = 0; 
    while (<>) 
    { 
        $line_no++; 
        $st = 1 if (/start-sql/); 
        $st = 0 if (/end-sql/); 
        $st = 2 if ($st == 1 && /select/); 
        $st = 3 if ($st == 2 && /from/); 
        if ($st == 2 && /^[ \t]+[a-zA-Z][a-zA-Z0-9]*[ \t*]$/) 
        { 
         if (! /select/) 
         { 
         printf ("Possible Error: Line: $line_no\n"); 
         } 
        } 
    } 
    

    我环绕我的意见select语句//启动SQL和//最终SQL。我希望这有帮助。 我已更改正则表达式以反映您如何格式化SQL,因为我一直在使用不同格式(使用前面的逗号)的 。

    作为我的构建/测试过程的一部分,我对代码运行一组检查。这是一个不到 完美的解决方案,但它帮助了我。

    (我有与计算器富文本编辑器改变了我的代码有点困难。 希望我将学习如何正确使用它。)

    +0

    感谢分享。我不确定多久我能够将其纳入我的工作流程,但是我非常感谢。出于好奇,你如何格式化你的SQL语句?我尝试写我的,所以我可以轻松地移动块,但仍然可读。 – 2009-11-19 17:08:39