前提

我最近在我的代码中的 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 突出显示逗号,以便我可以观察它。但是,我必须经常在其他环境中编写查询,包括我无法轻松执行此类操作的专有接口(interface)。

谢谢你的帮助!

最佳答案

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

丢失的:

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;

关于SQLite 列别名,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/1764747/

10-11 12:45