SQL の IN 句を DBI のプリペアードステートメントで使う場合

my $dbh = DBI->connect(...);

my @users  = ('yamada', 'sato', 'suzuki', 'takahashi');
my @values = map {'?'} @users;
my $place_holders = join ', ', @values;
my $sql = sprintf('SELECT id, timestamp FROM sample WHERE users IN (%s);', $place_holders);

# say $sql
# SELECT id, timestamp FROM sample WHERE users IN (?, ?, ?, ?);

my $sth = $dbh->prepare($sql);

eval {
    $sth->execute(@users);
};

if ($@) {
    $dbh->rollback;
    warn $dbh->errstr;
} else {
    $dbh->commit;
}