diff --git a/respx/patterns.py b/respx/patterns.py
index 37ab1d4..59a9e4d 100644
--- a/respx/patterns.py
+++ b/respx/patterns.py
@@ -504,9 +504,6 @@ def M(*patterns: Pattern, **lookups: Any) -> Optional[Pattern]:
     extras = None
 
     for pattern__lookup, value in lookups.items():
-        if not value:
-            continue
-
         # Handle url pattern
         if pattern__lookup == "url":
             extras = parse_url_patterns(value)
@@ -535,6 +532,10 @@ def M(*patterns: Pattern, **lookups: Any) -> Optional[Pattern]:
             lookup = Lookup(lookup_name) if lookup_name else None
             pattern = P(value, lookup=lookup)
 
+        # Skip patterns with no value, exept when using equal lookup
+        if not pattern.value and pattern.lookup is not Lookup.EQUAL:
+            continue
+
         patterns += (pattern,)
 
     # Combine and merge patterns

diff --git a/tests/test_patterns.py b/tests/test_patterns.py
index 0f06293..f90c561 100644
--- a/tests/test_patterns.py
+++ b/tests/test_patterns.py
@@ -66,6 +66,19 @@ def test_match_context():
     assert match.context == {"host": "foo.bar", "slug": "baz"}
 
 
+@pytest.mark.parametrize(
+    "kwargs,url,expected",
+    [
+        ({"params__eq": {}}, "https://foo.bar/", True),
+        ({"params__eq": {}}, "https://foo.bar/?x=y", False),
+        ({"params__contains": {}}, "https://foo.bar/?x=y", True),
+    ],
+)
+def test_m_pattern(kwargs, url, expected):
+    request = httpx.Request("GET", url)
+    assert bool(M(host="foo.bar", **kwargs).match(request)) is expected
+
+
 @pytest.mark.parametrize(
     "lookup,value,expected",
     [
@@ -217,6 +230,8 @@ def test_path_pattern():
         (Lookup.EQUAL, "y=2", "https://foo.bar/?x=1", False),
         (Lookup.EQUAL, {"x": ANY}, "https://foo.bar/?x=1", True),
         (Lookup.EQUAL, {"y": ANY}, "https://foo.bar/?x=1", False),
+        (Lookup.EQUAL, {}, "https://foo.bar/?x=1", False),
+        (Lookup.EQUAL, {}, "https://foo.bar/", True),
         (Lookup.EQUAL, "x=1&y=2", "https://foo.bar/?x=1", False),
         (Lookup.EQUAL, "y=2&x=1", "https://foo.bar/?x=1&y=2", True),
         (Lookup.EQUAL, "y=3&x=2&x=1", "https://foo.bar/?x=1&x=2&y=3", False),  # ordered

Cannot create a lookup to match empty params
https://github.com/lundberg/respx/blob/c76f632690cdfb2c878fe8fea999df0a26083eb3/respx/patterns.py#L502-L507

E.g. `respx_mock.get("https://example.com", params__eq={}).mock(...)` matches request with any query params including empty.
Looks like the value check must be more accurate.

respx version 0.19.2

tests/test_patterns.py::test_m_pattern[kwargs1-https://foo.bar/?x=y-False]
tests/test_patterns.py::test_url_pattern_invalid tests/test_patterns.py::test_port_pattern[Lookup.EQUAL-8080-https://foo.bar:8080/baz/-True] tests/test_patterns.py::test_host_pattern[Lookup.EQUAL-foo.bar-True] tests/test_patterns.py::test_match_context tests/test_patterns.py::test_params_pattern[Lookup.EQUAL-params17-https://foo.bar/?x=1-False] tests/test_patterns.py::test_host_pattern[Lookup.REGEX-.+\\.bar-True] tests/test_patterns.py::test_data_pattern[Lookup.EQUAL-data0-True] tests/test_patterns.py::test_json_pattern_path[json5-foo__ham-spam-False] tests/test_patterns.py::test_json_pattern[Lookup.EQUAL-value0-json0-True] tests/test_patterns.py::test_merge_patterns tests/test_patterns.py::test_m_pattern[kwargs2-https://foo.bar/?x=y-True] tests/test_patterns.py::test_port_pattern[Lookup.EQUAL-80-http://foo.bar/-True] tests/test_patterns.py::test_port_pattern[Lookup.EQUAL-None-//foo.bar/-True] tests/test_patterns.py::test_content_pattern[Lookup.EQUAL-foobar-True1] tests/test_patterns.py::test_params_pattern_hash tests/test_patterns.py::test_cookies_pattern[Lookup.CONTAINS-cookies1-request_cookies1-False] tests/test_patterns.py::test_json_pattern_path[json4-pk-123-True] tests/test_patterns.py::test_port_pattern[Lookup.EQUAL-80-https://foo.bar/-False] tests/test_patterns.py::test_port_pattern[Lookup.EQUAL-443-https://foo.bar/-True] tests/test_patterns.py::test_cookies_pattern[Lookup.EQUAL-cookies2-request_cookies2-True] tests/test_patterns.py::test_bitwise_operators[GET-https://foo.bar/baz/-False] tests/test_patterns.py::test_url_pattern[Lookup.STARTS_WITH-https://a.b/b-context7-https://a.b/baz/-True] tests/test_patterns.py::test_params_pattern[Lookup.CONTAINS-params7-https://foo.bar/?x=1&y=2-True] tests/test_patterns.py::test_method_pattern[Lookup.EQUAL-get-True] tests/test_patterns.py::test_parse_url_patterns tests/test_patterns.py::test_params_pattern[Lookup.EQUAL-y=2-https://foo.bar/?x=1-False] tests/test_patterns.py::test_url_pattern_hash tests/test_patterns.py::test_url_pattern[Lookup.REGEX-https?://a.b/(?P<c>\\w+)/-context0-http://a.b/c/-True] tests/test_patterns.py::test_cookies_pattern[Lookup.EQUAL-cookies5-None-True] tests/test_patterns.py::test_url_pattern[Lookup.EQUAL-https://a.b/c/-context3-https://a.b/c/-True] tests/test_patterns.py::test_scheme_pattern[Lookup.IN-scheme3-True] tests/test_patterns.py::test_url_pattern[Lookup.REGEX-^https://a.b/.+$-context1-https://a.b/c/-True] tests/test_patterns.py::test_params_pattern[Lookup.EQUAL-x=1-https://foo.bar/?x=1-True] tests/test_patterns.py::test_url_pattern[Lookup.EQUAL-https://a.b/?x=y-context6-https://a.b?x=y-True] tests/test_patterns.py::test_params_pattern[Lookup.EQUAL-y=3&x=2&x=1-https://foo.bar/?x=1&x=2&y=3-False] tests/test_patterns.py::test_params_pattern[Lookup.CONTAINS-x=2&x=1-https://foo.bar/?x=1&x=2&y=3-False] tests/test_patterns.py::test_json_pattern_path[json2-ham__1__egg-yolk-True] tests/test_patterns.py::test_port_pattern[Lookup.IN-port8-https://foo.bar/-True] tests/test_patterns.py::test_json_pattern_path[json0-foo__bar-baz-True] tests/test_patterns.py::test_params_pattern[Lookup.CONTAINS--https://foo.bar/-True] tests/test_patterns.py::test_scheme_pattern[Lookup.EQUAL-HTTPS-True] tests/test_patterns.py::test_iter_pattern tests/test_patterns.py::test_cookies_pattern[Lookup.EQUAL-cookies3-request_cookies3-True] tests/test_patterns.py::test_json_pattern[Lookup.EQUAL-value2-json2-True] tests/test_patterns.py::test_params_pattern[Lookup.CONTAINS-params10-https://foo.bar/?x=2&x=3-False] tests/test_patterns.py::test_bitwise_operators[GET-https://foo.bar/-True] tests/test_patterns.py::test_headers_pattern[Lookup.CONTAINS-headers1--False] tests/test_patterns.py::test_scheme_pattern[Lookup.EQUAL-https-True] tests/test_patterns.py::test_headers_pattern[Lookup.CONTAINS-headers0-request_headers0-True] tests/test_patterns.py::test_params_pattern[Lookup.EQUAL-y=3&x=1&x=2-https://foo.bar/?x=1&x=2&y=3-True] tests/test_patterns.py::test_bitwise_operators[POST-https://foo.bar/-True] tests/test_patterns.py::test_m_pattern[kwargs0-https://foo.bar/-True] tests/test_patterns.py::test_json_pattern[Lookup.EQUAL-value3-json3-False] tests/test_patterns.py::test_json_pattern[Lookup.EQUAL-json-string-json-string-True] tests/test_patterns.py::test_params_pattern[Lookup.CONTAINS-params5-https://foo.bar/?x=1-True] tests/test_patterns.py::test_json_pattern[Lookup.EQUAL-value1-json1-False] tests/test_patterns.py::test_cookies_pattern[Lookup.EQUAL-cookies4-request_cookies4-True] tests/test_patterns.py::test_cookies_pattern[Lookup.CONTAINS-cookies0-request_cookies0-True] tests/test_patterns.py::test_json_pattern[Lookup.EQUAL-value5-json5-True] tests/test_patterns.py::test_params_pattern[Lookup.CONTAINS-x=1-https://foo.bar/?x=1-True] tests/test_patterns.py::test_params_pattern[Lookup.CONTAINS-x=1&x=2-https://foo.bar/?x=1&x=2&y=3-True] tests/test_patterns.py::test_params_pattern[Lookup.CONTAINS-params6-https://foo.bar/?x=1-False] tests/test_patterns.py::test_cookies_pattern__hash tests/test_patterns.py::test_invalid_pattern tests/test_patterns.py::test_params_pattern[Lookup.EQUAL-params18-https://foo.bar/-True] tests/test_patterns.py::test_url_pattern[Lookup.EQUAL-https://a.b/x/-context4-https://a.b/c/-False] tests/test_patterns.py::test_port_pattern[Lookup.EQUAL-8080-https://foo.bar/baz/-False] tests/test_patterns.py::test_params_pattern[Lookup.CONTAINS-params8-https://foo.bar/?x=1-False] tests/test_patterns.py::test_params_pattern[Lookup.CONTAINS-x=1&x=2-https://foo.bar/?x=1&x=2&x=3-False] tests/test_patterns.py::test_params_pattern[Lookup.CONTAINS-params9-https://foo.bar/?x=1&x=2-True] tests/test_patterns.py::test_unique_pattern_key tests/test_patterns.py::test_params_pattern[Lookup.EQUAL--https://foo.bar/-True] tests/test_patterns.py::test_method_pattern[Lookup.EQUAL-GET-True] tests/test_patterns.py::test_method_pattern[Lookup.IN-value4-False] tests/test_patterns.py::test_path_pattern tests/test_patterns.py::test_content_pattern[Lookup.EQUAL-foobar-True0] tests/test_patterns.py::test_params_pattern[Lookup.EQUAL-params15-https://foo.bar/?x=1-True] tests/test_patterns.py::test_json_pattern_path[json6-1__name-lundberg-False] tests/test_patterns.py::test_params_pattern[Lookup.CONTAINS-params4-https://foo.bar/?x=1-True] tests/test_patterns.py::test_params_pattern[Lookup.CONTAINS-y=2-https://foo.bar/?x=1-False] tests/test_patterns.py::test_bitwise_and tests/test_patterns.py::test_params_pattern[Lookup.CONTAINS-x=1&y=2-https://foo.bar/?x=1-False] tests/test_patterns.py::test_bitwise_operators[PATCH-https://foo.bar/-True] tests/test_patterns.py::test_headers_pattern_hash tests/test_patterns.py::test_scheme_pattern[Lookup.EQUAL-http-False] tests/test_patterns.py::test_params_pattern[Lookup.EQUAL-params16-https://foo.bar/?x=1-False] tests/test_patterns.py::test_url_pattern[Lookup.STARTS_WITH-http://a.b/baz/-context8-https://a.b/baz/-False] tests/test_patterns.py::test_host_pattern[Lookup.EQUAL-ham.spam-False] tests/test_patterns.py::test_bitwise_operators[PUT-https://foo.bar/-False] tests/test_patterns.py::test_method_pattern[Lookup.EQUAL-POST-False] tests/test_patterns.py::test_url_pattern[Lookup.EQUAL-https://a.b?x=y-context5-https://a.b/?x=y-True] tests/test_patterns.py::test_port_pattern[Lookup.EQUAL-22-//foo.bar:22/baz/-True] tests/test_patterns.py::test_json_pattern_path[json3-0__name-jonas-True] tests/test_patterns.py::test_params_pattern[Lookup.EQUAL-x=1&y=2-https://foo.bar/?x=1-False] tests/test_patterns.py::test_params_pattern[Lookup.EQUAL-y=2&x=1-https://foo.bar/?x=1&y=2-True] tests/test_patterns.py::test_port_pattern[Lookup.IN-port9-https://foo.bar:8080/-False] tests/test_patterns.py::test_cookies_pattern[Lookup.EQUAL-cookies6-request_cookies6-False] tests/test_patterns.py::test_method_pattern[Lookup.IN-value3-True] tests/test_patterns.py::test_bitwise_operators[POST-https://ham.spam/-True] tests/test_patterns.py::test_port_pattern[Lookup.IN-port7-http://foo.bar/-True] tests/test_patterns.py::test_json_pattern_path[json1-x-value1-True] tests/test_patterns.py::test_url_pattern[Lookup.REGEX-https://a.b/c/-context2-https://x.y/c/-False]