Skip to main content
Prisma Documentation Docs

Search documentation

Type to search this documentation.

On this pageOverview

Filtering and Sorting (Prisma ORM v6) (/docs/orm/v6/prisma-client/queries/filtering-and-sorting)

For the complete Prisma documentation index, see llms.txt. A markdown version of any docs page is available by appending .md to its URL.

Use Prisma Client API to filter records by any combination of fields or related record fields, and/or sort query results.

Location: ORM > v6 > Prisma Client > Queries > Filtering and Sorting

Prisma Client supports filtering with the where query option, and sorting with the orderBy query option.

Prisma Client allows you to filter records on any combination of model fields, including related models, and supports a variety of filter conditions.

[!WARNING] Some filter conditions use the SQL operators LIKE and ILIKE which may cause unexpected behavior in your queries. Please refer to our filtering FAQs for more information.

The following query:

  • Returns all User records with:
    • an email address that ends with prisma.io and
    • at least one published post (a relation query)
  • Returns all User fields
  • Includes all related Post records where published equals true
TypeScript
const result = await prisma.user.findMany({
  where: {
    email: {
      endsWith: "prisma.io",
    },
    posts: {
      some: {
        published: true,
      },
    },
  },
  include: {
    posts: {
      where: {
        published: true,
      },
    },
  },
});
no-copy
[
  {
    id: 1,
    name: "Ellen",
    email: "ellen@prisma.io",
    role: "USER",
    posts: [
      {
        id: 1,
        title: "How to build a house",
        published: true,
        authorId: 1,
      },
      {
        id: 2,
        title: "How to cook kohlrabi",
        published: true,
        authorId: 1,
      },
    ],
  },
]

Refer to Prisma Client's reference documentation for a full list of operators , such as startsWith and contains.

You can use operators (such as NOT and OR ) to filter by a combination of conditions. The following query returns all users whose email ends with gmail.com or company.com, but excludes any emails ending with admin.company.com

TypeScript
const result = await prisma.user.findMany({
  where: {
    OR: [
      {
        email: {
          endsWith: "gmail.com",
        },
      },
      { email: { endsWith: "company.com" } },
    ],
    NOT: {
      email: {
        endsWith: "admin.company.com",
      },
    },
  },
  select: {
    email: true,
  },
});
no-copy
[{ email: "alice@gmail.com" }, { email: "bob@company.com" }]

The following query returns all posts whose content field is null:

TypeScript
const posts = await prisma.post.findMany({
  where: {
    content: null,
  },
});

The following query returns all posts whose content field is not null:

TypeScript
const posts = await prisma.post.findMany({
  where: {
    content: { not: null },
  },
});

Prisma Client supports filtering on related records. For example, in the following schema, a user can have many blog posts:

prisma
model User {  id    Int     @id @default(autoincrement())  name  String?  email String  @unique  posts Post[] // User can have many posts}model Post {  id        Int     @id @default(autoincrement())  title     String  published Boolean @default(true)  author    User    @relation(fields: [authorId], references: [id])  authorId  Int}

The one-to-many relation between User and Post allows you to query users based on their posts - for example, the following query returns all users where at least one post (some) has more than 10 views:

TypeScript
const result = await prisma.user.findMany({
  where: {
    posts: {
      some: {
        views: {
          gt: 10,
        },
      },
    },
  },
});

You can also query posts based on the properties of the author. For example, the following query returns all posts where the author's email contains "prisma.io":

TypeScript
const res = await prisma.post.findMany({
  where: {
    author: {
      email: {
        contains: "prisma.io",
      },
    },
  },
});

Scalar lists (for example, String[]) have a special set of filter conditions - for example, the following query returns all posts where the tags array contains databases:

TypeScript
const posts = await client.post.findMany({
  where: {
    tags: {
      has: "databases",
    },
  },
});

Case-insensitive filtering is available as a feature for the PostgreSQL and MongoDB providers. MySQL, MariaDB and Microsoft SQL Server are case-insensitive by default, and do not require a Prisma Client feature to make case-insensitive filtering possible.

To use case-insensitive filtering, add the mode property to a particular filter and specify insensitive:

TypeScript
const users = await prisma.user.findMany({
  where: {
    email: {
      endsWith: "prisma.io",
      mode: "insensitive", // Default value: default
    },
    name: {
      equals: "Archibald", // Default mode
    },
  },
});

See also: Case sensitivity

How does filtering work at the database level?

Section titled “How does filtering work at the database level?”

For MySQL and PostgreSQL, Prisma Client utilizes the LIKE (and ILIKE) operator to search for a given pattern. The operators have built-in pattern matching using symbols unique to LIKE. The pattern-matching symbols include % for zero or more characters (similar to * in other regex implementations) and _ for one character (similar to .)

To match the literal characters, % or _, make sure you escape those characters. For example:

TypeScript
const users = await prisma.user.findMany({
  where: {
    name: {
      startsWith: "_benny",
    },
  },
});

The above query will match any user whose name starts with a character followed by benny such as 7benny or &benny. If you instead wanted to find any user whose name starts with the literal string _benny, you could do:

TypeScript
const users = await prisma.user.findMany({
  where: {
    name: {
      startsWith: "\\_benny", // note that the `_` character is escaped, preceding `\` with `\` when included in a string
    },
  },
});

Use orderBy to sort a list of records or a nested list of records by a particular field or set of fields. For example, the following query returns all User records sorted by role and name, and each user's posts sorted by title:

TypeScript
const usersWithPosts = await prisma.user.findMany({
  orderBy: [
    {
      role: "desc",
    },
    {
      name: "desc",
    },
  ],
  include: {
    posts: {
      orderBy: {
        title: "desc",
      },
      select: {
        title: true,
      },
    },
  },
});
no-copy
[
  {
    "email": "kwame@prisma.io",
    "id": 2,
    "name": "Kwame",
    "role": "USER",
    "posts": [
      {
        "title": "Prisma in five minutes"
      },
      {
        "title": "Happy Table Friends: Relations in Prisma"
      }
    ]
  },
  {
    "email": "emily@prisma.io",
    "id": 5,
    "name": "Emily",
    "role": "USER",
    "posts": [
      {
        "title": "Prisma Day 2020"
      },
      {
        "title": "My first day at Prisma"
      },
      {
        "title": "All about databases"
      }
    ]
  }
]

Note: You can also sort lists of nested records to retrieve a single record by ID.

You can also sort by properties of a relation. For example, the following query sorts all posts by the author's email address:

TypeScript
const posts = await prisma.post.findMany({
  orderBy: {
    author: {
      email: "asc",
    },
  },
});

In 2.19.0 and later, you can sort by the count of related records.

For example, the following query sorts users by the number of related posts:

TypeScript
const getActiveUsers = await prisma.user.findMany({
  take: 10,
  orderBy: {
    posts: {
      _count: "desc",
    },
  },
});

Note: It is not currently possible to return the count of a relation.

In 3.5.0+ for PostgreSQL and 3.8.0+ for MySQL, you can sort records by relevance to the query using the _relevance keyword. This uses the relevance ranking functions from full text search features.

This feature is further explain in the PostgreSQL documentation and the MySQL documentation.

For PostgreSQL, you need to enable order by relevance with the fullTextSearchPostgres preview feature:

prisma
generator client {
  provider        = "prisma-client"
  output          = "./generated"
  previewFeatures = ["fullTextSearchPostgres"]
}

Ordering by relevance can be used either separately from or together with the search filter: _relevance is used to order the list, while search filters the unordered list.

For example, the following query uses _relevance to filter by the term developer in the bio field, and then sorts the result by relevance in a descending manner:

TypeScript
const getUsersByRelevance = await prisma.user.findMany({
  take: 10,
  orderBy: {
    _relevance: {
      fields: ["bio"],
      search: "developer",
      sort: "desc",
    },
  },
});

[!NOTE] Prior to Prisma ORM 5.16.0, enabling the fullTextSearch preview feature would rename the <Model>OrderByWithRelationInput TypeScript types to <Model>OrderByWithRelationAndSearchRelevanceInput. If you are using the Preview feature, you will need to update your type imports.

[!NOTE] Notes:

  • This feature is generally available in version 4.16.0 and later. To use this feature in versions 4.1.0 to 4.15.0 the Preview feature orderByNulls will need to be enabled.
  • This feature is not available for MongoDB.
  • You can only sort by nulls on optional scalar fields. If you try to sort by nulls on a required or relation field, Prisma Client throws a P2009 error.

You can sort the results so that records with null fields appear either first or last.

If name is an optional field, then the following query using last sorts users by name, with null records at the end:

TypeScript
const users = await prisma.user.findMany({  orderBy: {    updatedAt: { sort: "asc", nulls: "last" },  },});

If you want the records with null values to appear at the beginning of the returned array, use first:

TypeScript
const users = await prisma.user.findMany({  orderBy: {    updatedAt: { sort: "asc", nulls: "first" },  },});

Note that first also is the default value, so if you omit the null option, null values will appear first in the returned array.

Follow issue #841 on GitHub.

Suggest an edit

Propose a replacement for this page. The site team reviews it before applying any changes.

Export
Documentation menu