Jeff Curry-USA TODAY Sports

Willson Contreras and Tommy Edman each drove in two runs as the St. Louis Cardinals defeated the visiting Colorado Rockies 6-2 on Saturday.

Tyler O'Neill hit a homer for the Cardinals, who won for just the third time in their last nine games.

Ryan McMahon hit his 100th career home run for the Rockies, who lost for the third time in four games.

Cardinals starting pitcher Steven Matz (3-7) held the Rockies to one run on five hits and two walks in six innings. He struck out six.

Matz has allowed just two runs in 23 innings over his last four starts.

Rockies starter Ty Blach (1-1) allowed four runs on eight hits in 4 2/3 innings. He walked one and struck out two.

O'Neill's homer put the Cardinals up 1-0 in the second inning.

Colorado loaded the bases with two outs in the fourth but failed to score. Brendan Rodgers and Elias Diaz hit singles and Nolan Jones walked, but Elehuris Montero popped out to end the threat.

St. Louis increased its lead to 2-0 in the bottom of the inning. Contreras and Nolan Gorman hit singles, O'Neill walked to load the bases and Dylan Carlson hit a one-out sacrifice fly.

Matz had pitched 17 straight scoreless innings dating back to July 20 until the Rockies cut their deficit to 2-1 in the fifth on Saturday.

With one out in the inning, Brenton Doyle hit a single, advanced to third on Jurickson Profar's double and scored on Ezequiel Tovar's sacrifice fly.

But the Cardinals answered in the bottom of the frame. Paul Goldschmidt and Nolan Arenado hit one-out singles and both scored on Contreras' double to make it 4-1.

Carlson and Lars Nootbaar drew one-out walks in the sixth inning and scored on Edman's triple as the Cardinals upped their lead to 6-1.

McMahon's eighth-inning homer cut the Colorado deficit to 6-2.

More must-reads:

TODAY'S BEST
Welcome to the WNBA: Caitlin Clark sets infamous record in debut
Jalen Brunson leads Knicks to blowout win in Game 5 vs. Pacers
Nikola Jokic torches DPOY to lead Nuggets past Wolves in Game 5
Oilers use late heroics to tie Canucks at two games each
Watch: Astros pitcher ejected after foreign substance check
Kirk Cousins not angry with Falcons because winning is 'hard enough'
Bronny James has surprising comments on potentially teaming up with LeBron
Bills add two-time Super Bowl champ to new-look WR room
Brewers lose team-leading home run hitter to injured list
Sandy Alderson denies involvement in Mets, Billy Eppler IL controversy
Twins reliever shut down for six weeks with patellar tendon tear
Chris Finch throws shade at Nuggets star over Rudy Gobert’s fine
Cardinals head coach warns not to bet against Kyler Murray
Details emerge on Jason Kelce’s role at ESPN
Rangers defenseman wins Mark Messier Leadership Award
Ex-NFL head coach takes over as Arena Football League commish
Yankees young stud takes major step in return from injury
See top groupings for Rounds 1 and 2 at 2024 PGA Championship
Former Bruins winger dead at 75
Super Bowl-winning safety plans to retire after 2024 season