Logan Forsythe and Alexi Amarista had two RBI apiece in San Diego's sixth win in their last seven starts.
Edinson Volquez (10-10) lasted 5 1/3 innings and walked six batters but still got the win with three runs – two earned – on four hits.
Cameron Maybin and Yonder Alonso also tallied RBI for the Padres.
David Freese had a solo home run for the flagging Cardinals, who have lost five of six and hold a one-game lead over the Dodgers in the race for the final NL wild card berth.
Adam Wainwright (13-13) suffered the loss after allowing five runs -- two earned -- on five hits over six innings.
San Diego committed three errors in the game and St. Louis had one gaffe.
Megyn Kelly: Santa Claus and Jesus are both white men
Mathematician offers formula for finding the perfect Christmas tree