鉴于此perl DBI查询:
$qh = $db_connection->prepare ('SELECT addresses.* from addresses WHERE 1');
地址表结构将来可能会更改,也就是说,可能会在其中插入一些新列。因此,无法保证特定列可能分配给哪个索引号。
当我执行$qh->fetchrow_array
时,我希望能够确定特定列的索引号是什么,以便我可以检查它是否为空。例如,我想查看mail_addr
列是否为空,如下所示:
if (!$$row[$index_number]) {
do_something();
}
如何确定值$index_number
应该是什么?
答案 0 :(得分:3)
这可以通过$sth->{NAME}确定。但是,这种情况可能更适合于fetchrow_hashref,它实现了索引与您正在寻找的字段名称的所有粘合:
while ( my $row = $qh->fetchrow_hashref ) {
if (!$row->{mail_addr}) {
do_something();
}
}
还要考虑FetchHashKeyName属性,fetchrow_hashref('NAME_lc')或$sth->{NAME_lc}属性,这将保证DBI提供的字段名称的大小写。不同的SQL引擎会以不同的方式标准化标识符情况,通常取决于标识符在声明时是否被引用。
答案 1 :(得分:1)
首先,请不要使用$$row[$index_number]
语法。任何查看代码的人都希望看到代码为$row->[$index_number]
。
你已经弄清楚为什么SELECT *
是一个坏主意。所以不要这样做。列出您感兴趣的特定列 - 这样您就可以强制执行自己的订单(fetchrow_array
按照它们在SELECT子句中出现的顺序返回列。)
或者,切换到其中一个基于散列的提取方法,如fetchrow_hashref
。
但最好的选择是使用DBIx::Class。