I am adding some contributions. As far as I checked there's no overlap with the suggestions so far. If someone spots something, I would appreciate a comment and I will remove the duplicate.
I am grabbing from @E. Chan-López
m = {{1, 2, I}, {0, 0, 0}, {I, I, 3}, {2, 6, I}, {0, 0, 0}, {0, 0,
0}, {1, 6, 4}, {0, 0, 0}, {1, 4, 5}};
mm = {{1, 2, I}, {I, I, 3}, {2, 6, I}, {1, 6, 4}, {1, 4, 5}};
All of the following return True
DeleteElements[m, {0 ..} :> Infinity];
mm === %
m //. {0 ..} :> Unevaluated[## &[]];
mm === %
m //. {0 ..} -> Sequence[];
mm === %
m //. {0 ..} :> Nothing;
mm === %
Delete[Position[{0 ..}]@m]@m;
mm === %
Select[#, UnequalTo[0]] & /@ m //. {} :> Nothing;
mm === %
Cases[m, Except@{0 ..}];
mm === %
Select[m, x |-> FreeQ[x, {0 ..}]];
mm == %
Pick[m, Total /@ Unitize@m, Except[0 | _List]]
mm == %
Edit I am adding this variant which was suggested by the fellow 10-fold ways @ E. Chan-López in the comments
Pick[m, ! MatchQ[#, {0 ..}] & /@ m]
Cases[m, Except@{0 ..}]
seems the most natural way to me, but probably not the most efficient $\endgroup$Select[m, Norm[#] > 0&]
to perform better but I haven't tested it. $\endgroup$DeleteCases[m, {0 ..}]
should work. $\endgroup$m /. {0 ..} -> Sequence[]
$\endgroup$