4

DBIのfetchall_hashref()を使用してデータを取得するスクリプトがあります。

通常、次のようなハッシュ参照を返します。

{ 1 => { id => 1 } }

ただし、特定の列の最大値である、ハッシュの最初の項目の値にのみ関心があります。Perlハッシュが順序付けられていないことは知っていますが、幸いなことに、この特定のクエリは常に正確に1または0レコードを返します(これはMAX()クエリであるため)。

しかし、それを達成するために現在使用されているコードは本当に醜いです:

$results->{(keys %{$results})[0]}->{'id'};

これをアクティブにするためのよりエレガントな方法はありますか?(CPANモジュールに頼ることなく)

明確化

社内で使用しているデータアクセス層からハッシュを取得しています。すべてがfetchall_hashref()を介して返されます。私はfetchall_hashref()自体を呼び出さず、データアクセス関数が内部で実装される方法であると言われています。私はその返されたデータの消費者であり、それはたまたまハッシュの形式になっています。単一の戻り値クエリの結果にアクセスするための、より簡潔な方法が存在する場合は、それを探しています。

4

5 に答える 5

6

idで最初の値のキーを逆参照できます%$results

(values %$results)[0]->{id};

通常、これは返される値の順序が明確に定義されていない、同じマシンを使用する同じマシンでの実行間でも異なる可能性があるためですが、要素を含めることができるのは1つまたはゼロであるため、これは有効な方法です。keysvaluesperl%$results

于 2012-07-06T09:43:58.507 に答える
5

0/1行しか返されない場合は、fetchall_hashrefの代わりに、selectrow_arrayまたはselectrow_hashrefを実行してみませ

于 2012-07-06T09:28:38.177 に答える
5

なぜfetchall_hashref単一の値をフェッチするために使用しているのですか?これは、以下を使用して行う方が適切ですselectrow_array

my ($max) = $dbh->selectrow_array($sql);

更新:別のDBIメソッドを使用できない場合、より簡潔な方法は次のようになります。

my $val = [%$results]->[1]{id};
于 2012-07-06T09:29:56.030 に答える
1

データアクセス層は常にシーケンシャルキーを含むハッシュを返しますか?もしそうなら、それではどうですか

$results->{1}{id}

(もちろん、そうではないかもしれません...しかし、サンプルデータ1は最初のレコードのキーを使用しているため、データアクセス層が決定論的キーを使用している可能性があります。)

于 2012-07-06T10:32:04.153 に答える
0
my @keys = sort { $a <=> $b } keys %$results;
my $first = $keys[0];
$results->{$first}->{id};

または$first=1の場合;

$results->{1}->{id};
于 2012-07-06T09:29:04.173 に答える