Greene (4-6) allowed the one run and one hit in six innings as the Reds (74-71) snapped a three-game losing streak. He struck out nine and walked four.
Relievers Buck Farmer, Tejay Antone and Alexis Diaz followed with a scoreless inning each.
Joey Votto returned from the 10-day injured list to hit a homer and drive in two runs for the Reds. T.J. Friedl produced a solo homer, a triple and two runs for Cincinnati, and Jonathan India and Will Benson also hit homers.
Miles Mikolas (7-11) allowed five runs on seven hits in 5 1/3 innings for the Cardinals (63-80).
India, who was also marking his return from the injured list, and Benson hit their homers in the third inning to put the Reds up 2-0.
The Cardinals cut their deficit to 2-1 in the fourth inning after Nolan Arenado reached on an error leading off and Tyler O'Neill walked. Greene retired the next two batters before Andrew Knizner hit an RBI single.
Knizner stole second base, but Greene struck out Masyn Winn to strand two runners in scoring position.
India drew a one-out walk in the fifth inning and moved to third on Benson's two-out double. But Jake Fraley popped out to end the threat.
The Reds increased their lead to 5-1 in the sixth inning. Friedl hit a one-out triple and scored on Spencer Steer's single through the pulled-in infield. Nick Martini followed with an RBI triple off the base of the right field wall to knock Mikolas out of the game. Votto greeted reliever Andre Pallante with a run-scoring groundout.
Friedl's seventh-inning homer made it 6-1 and Votto's eighth-inning blast made it 7-1.
—Field Level Media