To summarize:
1. You're 100% positive that the alerting rule has
expr: (blah) > 20
2. If you put "(blah) > 20" in the PromQL browser and and switch to graph mode, then it's blank
3. But alerts are still firing
In that case, you need to go into the PromQL web interface and click on "Alerts" at the top. It will show you which alerts are currently firing, and the triggering label sets and values.
In short, it's impossible for expression "(blah) > 20" to fire if this expression returns an empty instant vector. So either it's *not* an empty instant vector; or else some other alert expression is firing. You didn't show any details from your OpsGenie messages, so it is at least possible that it's some other alerting rule that is causing the alerts.
You showed a graph of ALERTS{alertname="CPUSQLUtilizationWarning"} but no binding between that alert name and your alerting ruleset, since you didn't show the alert rule.
I believe you can have multiple alert rules with the same name. Maybe there's a copy-paste issue when you were duplicating an existing rule? So actually it's a different alert which is triggering with this name?
Finally: use promtool to check your config:
promtool check config /etc/prometheus/prometheus.yml