前提
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
来突出逗号,这样我就可以看到它了。但是,我必须经常在其他环境中编写查询,包括在其中我无法轻松执行此类操作的专有接口。
谢谢你的帮助!