- Patterns in [`Alternatives`](http://reference.wolfram.com/mathematica/ref/Alternatives.html) are tried in order
- Only the first pattern that matches is "applied" to the expression.
- `Cases` does not support multiple patterns outside of `Alternatives`.
I suppose it could be interesting to debate that design decision but nevertheless that's the way it works at this time.
You could of course search with multiple passes:
expr = f[x, g[y], z]
pat = h_[c_] | h_[c_, __] | h_[__, c_, __] | h_[__, c_];
Join @@ (Cases[expr, # :> h -> c, {0, -1}] & /@ List @@ pat)
> {g -> y, f -> x, f -> g[y], f -> z}
Or using `ReplaceList` and `Level`:
rules = # :> h -> c & /@ List @@ pat
Join @@ (ReplaceList[#, rules] & /@ Level[expr, {0, -1}])