diff --git a/frontend/test/metabase/scenarios/dashboard-filters/dashboard-filters-sql.cy.spec.js b/frontend/test/metabase/scenarios/dashboard-filters/dashboard-filters-sql.cy.spec.js
new file mode 100644
index 0000000000000000000000000000000000000000..cf416252e194bf163fe4f27e9e6a760c27f79a83
--- /dev/null
+++ b/frontend/test/metabase/scenarios/dashboard-filters/dashboard-filters-sql.cy.spec.js
@@ -0,0 +1,98 @@
+import {
+  restore,
+  popover,
+  mockSessionProperty,
+  filterWidget,
+  editDashboard,
+  saveDashboard,
+  setFilter,
+} from "__support__/e2e/cypress";
+
+import { DASHBOARD_SQL_TEXT_FILTERS } from "./helpers/e2e-dashboard-filter-data-objects";
+import { addWidgetStringFilter } from "../native-filters/helpers/e2e-field-filter-helpers";
+
+import { SAMPLE_DATASET } from "__support__/e2e/cypress_sample_dataset";
+
+const { PRODUCTS } = SAMPLE_DATASET;
+
+Object.entries(DASHBOARD_SQL_TEXT_FILTERS).forEach(
+  ([filter, { value, representativeResult, sqlFilter }]) => {
+    describe("scenarios > dashboard > filters > SQL > text/category", () => {
+      beforeEach(() => {
+        restore();
+        cy.signInAsAdmin();
+
+        mockSessionProperty("field-filter-operators-enabled?", true);
+
+        const questionDetails = getQuestionDetails(sqlFilter);
+
+        cy.createNativeQuestionAndDashboard({ questionDetails }).then(
+          ({ body: { id, card_id, dashboard_id } }) => {
+            cy.intercept("POST", `/api/card/${card_id}/query`).as("cardQuery");
+            cy.visit(`/question/${card_id}`);
+
+            // Wait for `result_metadata` to load
+            cy.wait("@cardQuery");
+
+            cy.visit(`/dashboard/${dashboard_id}`);
+          },
+        );
+
+        editDashboard();
+        setFilter("Text or Category", filter);
+
+        cy.findByText("Column to filter on")
+          .next("a")
+          .click();
+
+        popover()
+          .contains("Filter")
+          .click();
+      });
+
+      it(`should work for "${filter}" when set through the filter widget`, () => {
+        saveDashboard();
+
+        filterWidget().click();
+        addWidgetStringFilter(value);
+
+        cy.get(".Card").within(() => {
+          cy.contains(representativeResult);
+        });
+      });
+
+      it(`should work for "${filter}" when set as the default filter`, () => {
+        cy.findByText("Default value")
+          .next()
+          .click();
+
+        addWidgetStringFilter(value);
+
+        saveDashboard();
+
+        cy.get(".Card").within(() => {
+          cy.contains(representativeResult);
+        });
+      });
+    });
+  },
+);
+
+function getQuestionDetails(filter) {
+  return {
+    name: "SQL with Field Filter",
+    native: {
+      query: "select * from PRODUCTS where {{filter}}",
+      "template-tags": {
+        filter: {
+          id: "e05b9e58-3c51-676d-7334-4c2543709094",
+          name: "filter",
+          "display-name": "Filter",
+          type: "dimension",
+          dimension: ["field", PRODUCTS.CATEGORY, null],
+          "widget-type": filter,
+        },
+      },
+    },
+  };
+}
diff --git a/frontend/test/metabase/scenarios/dashboard-filters/helpers/e2e-dashboard-filter-data-objects.js b/frontend/test/metabase/scenarios/dashboard-filters/helpers/e2e-dashboard-filter-data-objects.js
index 2ab04f5cddc375dc51f1fea39e9be1625963d741..e7e08014fc1d5d0e4b0e292d177a9828419d9385 100644
--- a/frontend/test/metabase/scenarios/dashboard-filters/helpers/e2e-dashboard-filter-data-objects.js
+++ b/frontend/test/metabase/scenarios/dashboard-filters/helpers/e2e-dashboard-filter-data-objects.js
@@ -112,3 +112,36 @@ export const DASHBOARD_TEXT_FILTERS = {
     representativeResult: "47.68",
   },
 };
+
+export const DASHBOARD_SQL_TEXT_FILTERS = {
+  Dropdown: {
+    sqlFilter: "string/=",
+    value: "Gizmo",
+    representativeResult: "Rustic Paper Wallet",
+  },
+  "Is not": {
+    sqlFilter: "string/!=",
+    value: "Gadget",
+    representativeResult: "Rustic Paper Wallet",
+  },
+  Contains: {
+    sqlFilter: "string/contains",
+    value: "oo",
+    representativeResult: "Small Marble Shoes",
+  },
+  "Does not contain": {
+    sqlFilter: "string/does-not-contain",
+    value: "oo",
+    representativeResult: "Rustic Paper Wallet",
+  },
+  "Starts with": {
+    sqlFilter: "string/starts-with",
+    value: "G",
+    representativeResult: "Rustic Paper Wallet",
+  },
+  "Ends with": {
+    sqlFilter: "string/ends-with",
+    value: "y",
+    representativeResult: "Small Marble Shoes",
+  },
+};