Costa Rica inledde matchen starkt med press mot motståndarlagets mål. Först sköt Celso Borges i stolpen och därefter hotade Daniel Colindres med ett skott utifrån och träffade ribban.
Schweiz hade däremot bättre lycka framör mål. Bologna-mittfältaren Blerim Dzemaili höll sig i den 31:e minuten framme i straffområdet och gav Schweiz ledningen till 1-0.
Costa Rica överraskade därefter tidigt i andra halvlek. Kendall Waston nådde i den 56:e minuten högst på hörna och nickade in bollen i mål till 1-1.
Matchen slutade dock inte 1-1, för Josip Drmic satte 2-1 för Schweiz i den 88:e minuten. Kort därefter fick Costa Rica en straff efter att Bryan Ruiz fällts, men en VAR-bedömning senare hade domaren slagit fast att Ruiz var offside. Därför blev det ingen straff.
Men i den 92:a minuten pekade domaren återigen på punkten och gav Costa Rica en straff, efter att Joel Campbell fällts. Den straffen förvaltade Costa Rica till 2-2, genom Bryan Ruiz. Straffen tog i ribban och gick via Schweiz målvakts rygg in i nät.
Resultatet innebär att Schweiz blev tvåa i grupp E bakom Brasilien. Costa Rica slutade sist i gruppen.
Nu får Schweiz möta Sverige i åttondelsfinalen på tisdag. Två schweiziska nyckelspelare tvingas stå över den matchen.
Se 1-1-målet i spelaren ovan.
Sveriges åttondelsfinal mot Schweiz visas i TV4 och streamas på C More. Avspark klockan 16.00 tisdag den 3 juli.
Startelvor:
Schweiz: Sommer - Lichtsteiner, Schär, Akanji, Rodriguez - Behrami, Xhaka - Shaqiri, Dzemaili, Embolo - Gavranovic.
Costa Rica: Navas - Gamboa, Acosta, Gonzalez, Waston, Oviedo - Colindres, Borges, Guzman, Bryan - Campbell.