如何将SQL查询的结果存储为具有唯一键的哈希?

时间:2015-01-27 11:01:30

标签: sql oracle perl

我有一个返回多行的查询:

select id,status from store where last_entry = <given_date>;

返回的行如下所示:

id      status
-----------------
1131A   correct
1132B   incorrect
1134G   empty

我想存储结果如下:

$rows = [
    {
        ID1     => '1131A',
        status1 => 'correct'
    }, 
    {
        ID2     => '1132B',
        status2 => 'incorrect'
    },
    {
        ID3     => '1134G',
        status3 => 'empty'
    }
];

我该怎么做?

5 个答案:

答案 0 :(得分:0)

您正在寻找的是Perl中哈希的哈希值。你做的是

  1. 迭代查询结果。
  2. 按标签分割每个条目
  3. 创建一个哈希,其id为key,status为value
  4. 现在要存储每个此类查询创建的哈希,您需要创建另一个哈希。这里的关键可能是&#39; given_date&#39;在你的情况下,你可以写

    $parent_hash{given_date}=\%child_hash

  5. 这将导致父哈希具有每个查询结果的引用

    有关更多信息,请参阅以下资源:

    http://perldoc.perl.org/perlref.html

    http://www.thegeekstuff.com/2010/06/perl-array-reference-examples/

答案 1 :(得分:0)

查看DBI documentation

以下是执行所需操作的脚本的一部分:

my $rows;
while(my $hash_ref = $sth->fetchrow_hashref) {
    push @$rows, $hash_ref;
}

答案 2 :(得分:0)

您可以将Slice选项传递给DBI的{​​{3}}来执行此操作:

my $results = $dbh->selectall_arrayref(
    'select id,status from store where last_entry = ?',
    { Slice => {} },
    $last_entry
);

这将返回一个数组引用,每行存储在一个哈希中。请注意,由于散列键必须是唯一的,因此如果查询中有重复的列名,则会遇到问题。

答案 3 :(得分:0)

你想要这样的东西:

# select the data as an array of hashes - retured as an arrayref
my $rows = $dbh->selectall_arrayref($the_query, {Slice => {}}, @any_search_params);

# now make the id keys unique
my $i = 1;
foreach my $row ( @$rows) {
   # remove each column and assign the value to a uniquely named column
   # by adding a numeric suffix
   $row->{"ID" . $i} = delete $row->{ID};
   $row->{"status" . $i} = delete $row->{status};
   $i += 1;
}

添加您自己的错误检查。

所以你说&#34;保存为哈希,&#34;但是你的例子是一个哈希数组。因此哈希散列的方法略有不同。

答案 4 :(得分:0)

这是一个立即引发红旗的问题。想要一个异构数据结构的集合(数组/数组引用)是一个奇怪的请求 - 这是集合的全部要点。如果您告诉我们您打算如何处理数据而不是您想要的数据,我们可能会建议更好的解决方案。