0

我看到很多“相关”的问题出现了,但我没有看到回答这个特定的场景。

在解析从 SQL 选择语句生成的结果集的 while/for 循环期间,如果下一行包含相同的字段数据(无论是第一个字段还是第 x 个字段)?

例如,如果两行是:

('EML-E','jsmith@mail.com','John','Smith')
('EML-E','jsmith2@mail.com','John','Smith')

基于“EML-E”在两行中相同的事实,仅打印第一行的最佳方法是什么?

现在,我正在这样做:

  • 将第一个字段(特定于我的场景)存储到一个 2 元素数组(dupecatch[1])中
  • 检查是否 dupecatch[0] = dupcatch[1](重复 - 使用 's' 的转义循环)
  • 处理完行后,设置 dupecatch[0] = dupecatch[1]

    while ($DBS->SQLFetch() == *PLibdata::RET_OK)
    {
        $s=0; #s = 1 to escape out of inside loop
        while ($i != $array_len and $s==0)
        {
            $rowfetch = $DBS->{Row}->GetCharValue($array_col[$i]);
            if($i==0){$dupecatch[1] = $rowfetch;} #dupecatch prevents duplicate primary key field entries
            if($dupecatch[0] ne $dupecatch[1])
            {
                dosomething($rowfetch);
            }
            else{$s++;}
            $i++;
        }
        $i=0;
        $dupecatch[0]=$dupecatch[1];
    }
    
4

2 回答 2

7

如果您只关心连续重复的项目,那就是标准方式,但 $dupecatch[0] 通常被命名为 $old 而 $dupecatch[1] 通常只是有问题的变量。您可以判断该数组不合适,因为您只引用了它的索引。

如果要避免所有重复项,可以使用 %seen 哈希:

my %seen;
while (defined (my $row = get_data())) {
    next if $seen{$row->[0]}++; #skip all but the first instance of the key
    do_stuff();
}
于 2009-05-04T14:53:19.830 回答
1

我建议在您的 SQL 语句中使用 DISTINCT。这可能是迄今为止最简单的解决方法。

于 2009-05-04T14:53:32.013 回答