代码之家  ›  专栏  ›  技术社区  ›  Benjamin Oakes

sqlite列别名

  •  3
  • Benjamin Oakes  · 技术社区  · 15 年前

    前提

    我最近在一个 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 . 对于上面这样的短查询(尤其是当每一列的值都非常不同时),可以很容易地注意到这一点,但它出现在一个相当复杂的查询中,其中大部分是整型列,如下所示:

    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 但我们需要的是我们要比这更具选择性。

    问题

    我要寻找的是一种阻止这种情况再次发生的策略。

    有没有办法要求 作为 对列进行别名时?或是写东西的把戏让它出错?(例如,在C语言中,我开始写作 1 == foo 而不是 foo == 1 当我不小心漏掉了一个等号,使它无效时,会导致编译错误。 1 = foo 而不是 foo = 1 。)

    我使用 vim 正常情况下,我可以用 hlsearch 突出显示逗号,以便我可以看到它。但是,我必须经常在其他环境中编写查询,包括一个专有的接口,在这个接口中我不能轻松地执行类似的操作。

    谢谢你的帮助!

    5 回复  |  直到 11 年前
        1
  •  6
  •   scwagner    15 年前

    我以前做过的一件事是将逗号移到行首。这会带来一些好处。首先,您可以立即查看是否缺少任何逗号。第二,您可以在末尾添加一个新列,而不必修改以前的最后一行。

    失踪:

    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;
    
        2
  •  1
  •   Larry Lustig    15 年前

    您可以将SQL调用包装在一个函数中,该函数可以:

    1. 迭代结果集中的列,检查包含空格的列名

    1. 接受SQL语句和整数预期列数,然后检查结果集以确保列数与预期相符。
        3
  •  1
  •   Philip Schlump    15 年前

    我和你有同样的问题。我用make和perl脚本对我的代码进行类似lint的检查已经很长时间了。它有助于防止许多这样的错误。 在makefile中,我有:

    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" );
          }
       }
    }
    

    我用注释//开始SQL和//结束SQL包围了select语句。我希望这有帮助。 我已经更改了正则表达式,以反映您如何像以前那样格式化SQL 使用不同的格式(前面有逗号)。

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

    (我在StackOverflow富文本编辑器中修改代码有点困难。 希望我能学会如何正确使用它。)

        4
  •  0
  •   glebm    15 年前

    在名字前写一个逗号

    first
    ,short
    ,medium
    ,longlonglong
    ,...
    

    VS

    first,
    short,
    medium,
    longlonglong,
    ...
    

    还可以很容易地看到SQL select参数列表

    在任何IDE中工作:)

        5
  •  -1
  •   Randal Schwartz    15 年前

    如果列的名称相似,只能用后缀数字区分,那么您已经丢失了。你的数据库设计不好。

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