一尘不染

SQLite列别名

sql

前提

最近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

…的所有值都brown在名为的列中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,但是我们需要的是比这更具选择性。

问题

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

别名列时是否有要求as?还是写东西使其出错的技巧?(例如,在类似C的语言中,当我不小心遗漏了一个等号,使之成为而不是时,我开始编写1 == foo而不是foo == 1引起编译错误。)1 = foo``foo = 1

vim通常使用,所以我可以用hlsearch突出显示逗号来吸引眼球。但是,我不得不经常在其他环境中编写查询,包括一个专有接口,在该接口中我无法轻松地做到这一点。

谢谢你的帮助!


阅读 127

收藏
2021-05-30

共1个答案

一尘不染

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

丢失的:

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;
2021-05-30