Eren Derdiyok struck a hat-trick as the Swiss grabbed a first win over Germany in 56 years.
Joachim Low’s side were without eight Bayern Munich players, rested after last weekend’s Champions League final, but the Germany boss still fielded a strong line-up including Per Mertesacker, Lukas Podolski and Miroslav Klose.
Swiss striker Derdiyok shocked Germany with two goals in two minutes midway through the first half, and while Mats Hummels pulled a goal back on half-time the Swiss striker completed his hat-trick on 50 minutes.
Germany twice pulled goals back again, through Andre Schurrle and Marco Reus but on each occasion the Swiss had a reply thanks to Stephan Lichtsteiner and Admir Mehmedi.
Holland suffered a surprise 2-1 defeat to Bulgaria in Amsterdam after a last-minute winner from substitute Illiyan Mitsanski.
Robin van Persie, who was partnered by Klaas Jan Huntelaar up front in a near full-strength Oranje team, opened the scoring after 45 minutes.
But Ivelin Popov equalised with a 50th-minute penalty, after Rafael van der Vaart handled in the area, before Mitsanski won it.
Elsewhere in Europe, World and European champions Spain eased to a 2-0 win over Serbia following second-half goals from Adrian Lopez and Santi Cazorla in Saint Gallen.
A makeshift Spain needed the inspiration of substitute Adrian, who headed in Jesus Navas’ teasing cross on 64 minutes, before he was brought down by Branislav Ivanovic for Cazorla’s penalty soon after.
Euro 2012 co-hosts Poland grabbed a 1-0 win over Slovakia, Damien Perquis deciding the contest on 30 minutes, while the Republic of Ireland won by the same score at home to Bosnia-Herzegovina.
Denmark were comfortably beaten 3-1 by Brazil with Hulk netting a double. The damage was done before half-time with the Porto man on target either side of a Niki Zimling own goal. Nicklas Bendtner grabbed a consolation for the Danes on 71 minutes.
Cristiano Ronaldo was unable to inspire Portugal, before being subbed after 72 minutes, as they played out a goalless draw with Macedonia.