Basic idea: use branching to combine many shaders into one. An uber shader can save performance by reducing state changes, depending upon a number of other factors.
Yes, this is a state change (and shader recompile in pixel shader). Uber shaders can be used to avoid state changes, but uber shaders use extremely coherent dynamic branching (branch condition supplied as a vertex attribute), rather than static branching.