diff --git a/frontend/src/metabase-lib/Dimension.ts b/frontend/src/metabase-lib/Dimension.ts
index d49fda38657976b7922259a36f2ab1bdde038f39..2b554ef6b935f7ae4733822a825a2157c7060646 100644
--- a/frontend/src/metabase-lib/Dimension.ts
+++ b/frontend/src/metabase-lib/Dimension.ts
@@ -1247,8 +1247,9 @@ export class ExpressionDimension extends Dimension {
         return dimension?.field();
       };
 
-      type = infer(expr, mbql => field(mbql)?.base_type);
-      semantic_type = infer(expr, mbql => field(mbql)?.semantic_type);
+      type = infer(expr, mbql => field(mbql)?.base_type) ?? type;
+      semantic_type =
+        infer(expr, mbql => field(mbql)?.semantic_type) ?? semantic_type;
     } else {
       type = infer(this._expressionName);
     }
diff --git a/frontend/test/metabase/scenarios/question/reproductions/28221-missing-custom-field-metadata.cy.spec.js b/frontend/test/metabase/scenarios/question/reproductions/28221-missing-custom-field-metadata.cy.spec.js
new file mode 100644
index 0000000000000000000000000000000000000000..ac6d7d94af34f5f8e49bb20cef0df00a632e1ba8
--- /dev/null
+++ b/frontend/test/metabase/scenarios/question/reproductions/28221-missing-custom-field-metadata.cy.spec.js
@@ -0,0 +1,48 @@
+import { restore } from "__support__/e2e/helpers";
+
+import { SAMPLE_DATABASE } from "__support__/e2e/cypress_sample_database";
+
+const { PRODUCTS_ID, PRODUCTS, ORDERS_ID, ORDERS } = SAMPLE_DATABASE;
+
+describe("issue 28221", () => {
+  beforeEach(() => {
+    restore();
+    cy.signInAsAdmin();
+  });
+
+  it("should be able to select see notebook view even if a question custom field metadata is missing#27462", () => {
+    const questionName = "Reproduce 28221";
+    const customFieldName = "Non-existing field";
+    const questionDetails = {
+      name: questionName,
+      query: {
+        "source-table": ORDERS_ID,
+        joins: [
+          {
+            fields: "all",
+            "source-table": PRODUCTS_ID,
+            condition: [
+              "=",
+              ["field", ORDERS.PRODUCT_ID, null],
+              ["field", PRODUCTS.ID, { "join-alias": "Products" }],
+            ],
+            alias: "Products",
+          },
+        ],
+        expressions: {
+          [customFieldName]: ["field", 9999, null],
+        },
+      },
+    };
+
+    cy.createQuestion(questionDetails).then(({ body }) => {
+      const questionId = body.id;
+
+      cy.visit(`/question/${questionId}/notebook`);
+    });
+
+    cy.findByDisplayValue(questionName).should("be.visible");
+
+    cy.findByText(customFieldName).should("be.visible");
+  });
+});