0

多くの「関連する」質問が表示されますが、この特定のシナリオに答えるのを見たものはありません。

SQLselectステートメントから生成された結果セットを解析するwhile/forループ中に、前の行に同じフィールドデータが含まれている場合(最初のフィールドであるか、 x番目のフィールド)?

たとえば、2つの行が次の場合:

('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 に答える