Mikel Oyarzabal was Spain's penalty shootout hero, as his winning spot-kick finally dumped out brave 10-man Switzerland in St Petersburg and sent his side into the Euro 2020 semi-finals, where they'll meet either Belgium or Italy next Tuesday.
Switzerland had beaten tournament favourites France in a shootout in the last round but there were misses galore as they were undone 3-1 on spot-kicks this time, after holding Spain to a 1-1 draw through extra-time, following Remo Freuler's harsh red card on 77 minutes.
Spain had got off to a flying start to the match when a big deflection off Denis Zakaria took Jordi Alba's shot past Yann Sommer but, despite losing key man Breel Embolo early on, Switzerland battled back and capitalised on another defensive howler from Luis Enrique's side when Xherdan Shaqiri levelled.
Freuler's sending off tilted the odds back in Spain's favour but despite peppering Sommer's goal in extra-time they couldn't find a winner.
When Sergio Busquets hit Spain's first penalty against the post in the shootout it seemed Switzerland may pull off another big upset, but while Rodri also failed to convert for Spain later on, errors from Fabian Schar, Manuel Akanji, and Ruben Vargas allowed Oyarzabal to book his side's place in the first semi-final at Wembley.
Spain: Simon (7), Azpilicueta (6), Laporte (6), P Torres (6), Alba (7), Koke (6), Busquets (6), Pedri (7), F Torres (7), Sarabia (6), Morata (6).
Subs: Olmo (6), Moreno (5), Llorente (6), Oyarzabal (7), Thiago, (N/A), Rodri (N/A),
Switzerland: Sommer (9), Widmer (6), Elvedi (7), Akanji (7), Rodriguez (7), Zuber (6), Zakaria (6), Freuler (7), Shaqiri (8), Embolo (N/A), Seferovic (6).
Subs: Vargas (6), Schar (N/A), Sow (6), Gavranovic (6), Fassnacht (6), Mbabu (N/A)
Man of the match: Yann Sommer (Switzerland)
How Spain made the semis...
Spain had scored 10 goals in their previous two Euro 2020 games and they found the net inside 10 minutes on Friday evening, as Switzerland's aim of recording a second shock in a row, after knocking out France in the last-16, got off to the worst possible start.
- Spain made two changes from their last-16 win over Croatia, with Pau Torres replacing Eric Garcia at centre-back and Jordi Alba in ahead of Jose Gaya at left-back.
- Switzerland were forced into one change from their victory over France, with Denis Zakaria taking the spot of suspended captain Granit Xhaka and Xherdan Shaqiri getting the armband.
A poor Spain corner missed everyone in the box but came out to Alba and the defender's drive was deflected in by Zakaria, leaving Sommer no chance.
It was a cruel twist for Zakaria, who was in the team as a replacement for suspended Swiss captain Granit Xhaka, and the 10th own goal of the tournament - more than had been seen at the previous 15 editions of the Euros combined.
Switzerland's task got even harder on 22 minutes when Embolo was forced off with a hamstring injury, forcing boss Vladimir Petkovic into yet another rethink, as Spain bossed possession and Cesar Azpilicueta fired a firm free header straight at Sommer when he should have done better.
- How the teams lined up | In-depth stats and analysis
- Subscribe to the Sky Sports Football Euros Podcast
- Euro 2020 fixtures and schedule
Akanji and Nico Elvedi headed over from corners later in the half but Spain were out of the blocks quickly again in the second, with half-time sub Dani Olmo shooting at Sommer - although an offside flag on Alvaro Morata may have denied him anyway.
Set pieces appeared to be Switzerland's best hope of getting back into the game, with Shaqiri trying an audacious shot from one corner, before Zakaria headed narrowly wide from another.
Their best moment in open play came on 65 minutes when, Steven Zuber poked a shot at Unai Simon after good work from sub Vargas but clear chances were at a premium - until Spain gave them an absolute gift.
Aymeric Laporte had time and space to deal with a chipped pass forwards on the edge of his penalty area but his poor touch rebounded off Pau Torres and the loose ball fell to Freuler in the box, who had the simple task of squaring for Shaqiri to tuck in his third of the tournament.
The pair of Spanish centre-backs almost reprieved themselves soon after but were unable to convert a free-kick into the Swiss box. However, their opponents were then reduced to 10 men.
Freuler's sliding tackle on Moreno was fast and his feet slightly up off the ground and, while it would likely have gone unpunished in the past, referee Michael Oliver was quick to brandish his red card and VAR stuck with his decision.
A lacklustre Spain couldn't make that advantage count during normal time, with a tame Moreno shot on target their only real effort of note during the closing stages of the 90 minutes - and the striker was culpable of a poor miss from inside the six-yard box when he met Alba's cross at the start of extra-time.
As 10-man Switzerland tired, Spain finally stepped up their attacking intensity, with Alba's shot tipped over, Olmo's effort deflected wide, Sommer saving from close range from Moreno and Oyarzabal twice denied in the first half of extra-time.
Spain continued to rain shots on Sommer's goal after the break but Switzerland stood firm, with Ricardo Rodriguez coming up with a brilliant block when Marcos Llorente looked certain to score, to force the tie to penalties.
In the shootout, Spain continued to struggle to find the net, with Busquets missing their sixth penalty in a row with his opening strike against the post, but three misses from the Swiss reprieved him and team-mate Rodri, as Luis Enrique's side finally ended their opponent's tournament to remember.
What the managers said...
Spain boss Luis Enrique: "That was the most tranquil penalty shoot-out I've ever been through because we'd done all our homework, all our practice and there was nothing left for the staff and me to do."
"We are so proud. It'd be ridiculous to think that we, or any of the semi-finalists, would settle for just getting that far now - all of us want to get to the final and win."
"We faced Switzerland knowing their level and their capacity. The opponents didn't press us as high as they might have. The game went into a dangerous phase at 1-0, and they were building good breaks. But from the red card the game changed around completely - we dominated, were dangerous and created chances.
"I've said from the outset that we are one of the seven or eight teams which, no exaggeration, could win this trophy - now we're one of four."
Switzerland boss Vladimir Petkovic: "I am a positive person. We have to go home taking the positives.
"I have mixed feelings. I have pride - we can all be so proud. We leave here with our heads held high. On the other hand, we were so close to the semi-final, and that doesn't happen often. I have more positive than negative feelings.
"My players were the heroes of the night. We would have deserved to go to the semi-final."
Opta stats - Back to the penalty pain for Switzerland...
- Spain progressed from a European Championship match via a penalty shootout for a fourth time (also 1984 v Denmark, 2008 v Italy, 2012 v Portugal), more than any other nation in the competition's history.
- All three of Switzerland's knockout stage matches at the European Championships have gone to penalties (also v Poland in 2016 and France this year).
- Switzerland's Denis Zakaria was credited with what was the 10th own goal to be scored at Euro 2020 - more than the 15 previous editions of the European Championship finals combined (nine). Spain themselves have benefitted from three of those 10 own goals (also Martin Dúbravka and Juraj Kucka v Slovakia).
- Switzerland's Remo Freuler received the sixth red card awarded at Euro 2020, twice as many as were given at the previous tournament in 2016 (three). Indeed, only 2000 (10) and 1996 (7) have ever seen more at a single European Championship edition.
- Switzerland goalkeeper Yann Sommer made 10 saves against Spain, the most by a goalkeeper in a knockout round match without losing that game since Ivo Viktor made 15 saves for Czechoslovakia in the 1976 final v Germany, which the Czechs won on penalties.
Spain will play the winner of Belgium vs Italy in the semi-finals of Euro 2020 at Wembley on Tuesday 6 July.