筛选 REST 中的数据($filter)

筛选将大型数据集缩小为仅所需的记录。 在 REST 中,数据 API 生成器(DAB)支持 OData 启发的 $filter 查询参数。 每个筛选器编译为参数化 SQL,以确保安全性和一致性。

快速浏览

Operator Meaning
eq 平等
ne 不等于
gt 大于
ge 大于或等于
lt 小于
le 小于或等于
and 逻辑 AND
or 逻辑 OR
not 逻辑“非”
( ) 分组

eq

等于。 返回字段的值与提供的文字或 null

在此示例中,我们获取标题相等 'Dune'的书籍,可用标志为 true,价格为 20,发布日期为 2024 年 1 月 1 日,分级为 null。

GET /api/books?$filter=
  title eq 'Dune' and
  available eq true and
  price eq 20 and
  published_on eq 2024-01-01T00:00:00Z and
  rating eq null

注释

$filter 支持 eq nullne null 直接进行 null 比较。

概念 SQL

SELECT * FROM Books
WHERE title = 'Dune'
  AND available = 1
  AND price = 20
  AND published_on = '2024-01-01T00:00:00Z'
  AND rating IS NULL;

ne

不等于。 返回字段的值与给定文本不匹配或不为 null 的记录。

在此示例中,我们将获取标题不 'Foundation'为、可用标志不为 false、价格不为零、发布日期不是 2023 年 12 月 31 日且分级不为 null 的书籍。

GET /api/books?$filter=
  title ne 'Foundation' and
  available ne false and
  price ne 0 and
  published_on ne 2023-12-31T00:00:00Z and
  rating ne null

注释

筛选日期或日期/时间字段时,请使用 无引号 的 ISO 8601 UTC 格式(yyyy-MM-ddTHH:mm:ssZ)。 带引号或 OData 样式的格式无效。

  • 错误: $filter=Date ge '2025-01-01'
  • 错误: $filter=Date ge datetime'2025-01-01'
  • 正确:$filter=Date ge 2025-01-01T00:00:00Z

概念 SQL

SELECT * FROM Books
WHERE title <> 'Foundation'
  AND available <> 0
  AND price <> 0
  AND published_on <> '2023-12-31T00:00:00Z'
  AND rating IS NOT NULL;

gt

大于。 返回字段值严格高于给定文本的记录。

在此示例中,我们获取的书籍标题按字母顺序 'A'排序,可用标志为 true,价格大于 10,发布日期在 2020 年 1 月 1 日之后。

GET /api/books?$filter=
  title gt 'A' and
  available gt false and
  price gt 10 and
  published_on gt 2020-01-01T00:00:00Z

概念 SQL

SELECT * FROM Books
WHERE title > 'A'
  AND available > 0
  AND price > 10
  AND published_on > '2020-01-01T00:00:00Z';

ge

大于或等于。 返回字段值高于或等于给定文本的记录。

在此示例中,我们获取的书籍标题 'A' 为或更高版本,可用标志为 true,价格至少为 10,发布日期为 2020 年 1 月 1 日或之后。

GET /api/books?$filter=
  title ge 'A' and
  available ge false and
  price ge 10 and
  published_on ge 2020-01-01T00:00:00Z

概念 SQL

SELECT * FROM Books
WHERE title >= 'A'
  AND available >= 0
  AND price >= 10
  AND published_on >= '2020-01-01T00:00:00Z';

lt

小于。 返回字段值严格低于给定文本的记录。

在此示例中,我们获取其标题排序之前的 'Z'书籍,可用标志为 false,价格小于 50,发布日期在 2030 年 1 月 1 日之前。

GET /api/books?$filter=
  title lt 'Z' and
  available lt true and
  price lt 50 and
  published_on lt 2030-01-01T00:00:00Z

概念 SQL

SELECT * FROM Books
WHERE title < 'Z'
  AND available < 1
  AND price < 50
  AND published_on < '2030-01-01T00:00:00Z';

le

小于或等于。 返回字段值小于或等于给定文本的记录。

在此示例中,我们获取的书籍的标题排序之前或等于 'Z',可用标志为 true,价格为 100 或更少,发布日期在 2030 年 1 月 1 日或之前。

GET /api/books?$filter=
  title le 'Z' and
  available le true and
  price le 100 and
  published_on le 2030-01-01T00:00:00Z

概念 SQL

SELECT * FROM Books
WHERE title <= 'Z'
  AND available <= 1
  AND price <= 100
  AND published_on <= '2030-01-01T00:00:00Z';

and

逻辑 AND。 合并多个条件,这些条件必须全部为 true 才能匹配记录。

在此示例中,我们获取标题 'Dune'所在书籍,可用标志为 true,价格小于 50,发布日期在 2020 年 1 月 1 日之后,评级为 null。

GET /api/books?$filter=
  title eq 'Dune' and
  available eq true and
  price lt 50 and
  published_on ge 2020-01-01T00:00:00Z and
  rating eq null

概念 SQL

SELECT * FROM Books
WHERE title = 'Dune'
  AND available = 1
  AND price < 50
  AND published_on >= '2020-01-01T00:00:00Z'
  AND rating IS NULL;

or

逻辑或。 合并一个条件,其中至少一个必须为 true 才能匹配记录。

在此示例中,我们获取标题所在的 'Dune'书籍,或者可用标志为 true,或者价格大于 20,或者发布日期在 2025 年 1 月 1 日之前,或者分级为 null。

GET /api/books?$filter=
  title eq 'Dune' or
  available eq true or
  price gt 20 or
  published_on lt 2025-01-01T00:00:00Z or
  rating eq null

概念 SQL

SELECT * FROM Books
WHERE title = 'Dune'
  OR available = 1
  OR price > 20
  OR published_on < '2025-01-01T00:00:00Z'
  OR rating IS NULL;

not

逻辑 NOT。 仅当条件为 false 时,才会返回记录。

在此示例中,我们获取所有没有标题 'Romance'、不可用、不花费低于 10 美元的书籍,在 2020 年 1 月 1 日之前未发布,并且没有空评级。

GET /api/books?$filter=
  not (
    title eq 'Romance' and
    available eq false and
    price lt 10 and
    published_on lt 2020-01-01T00:00:00Z and
    rating eq null
  )

概念 SQL

SELECT * FROM Books
WHERE NOT (
  title = 'Romance'
  AND available = 0
  AND price < 10
  AND published_on < '2020-01-01T00:00:00Z'
  AND rating IS NULL
);

( ) 分组

对子表达式进行分组,以便可以在复杂筛选器中控制评估顺序。

在此示例中,我们获取标题为或'Fiction''SciFi'低于 $25 的书籍,并且该书的价格低于 25 美元,发布日期在 2020 年 1 月 1 日之后,评级为 null。

GET /api/books?$filter=
  (title eq 'Fiction' or title eq 'SciFi') and
  (available eq true or price lt 25) and
  published_on ge 2020-01-01T00:00:00Z and
  rating eq null

概念 SQL

SELECT * FROM Books
WHERE (title = 'Fiction' OR title = 'SciFi')
  AND (available = 1 OR price < 25)
  AND published_on >= '2020-01-01T00:00:00Z'
  AND rating IS NULL;

示例配置

{
  "runtime": {
    "pagination": {
      "default-page-size": 100,
      "max-page-size": 100000
    }
  },
  "entities": {
    "Book": {
      "source": {
        "type": "table",
        "object": "dbo.books"
      },
      "mappings": {
        "sku_title": "title",
        "sku_price": "price"
      },
      "relationships": {
        "book_category": {
          "cardinality": "one",
          "target.entity": "Category",
          "source.fields": [ "category_id" ],
          "target.fields": [ "id" ]
        }
      }
    },
    "Category": {
      "source": {
        "type": "table",
        "object": "dbo.categories"
      },
      "relationships": {
        "category_books": {
          "cardinality": "many",
          "target.entity": "Book",
          "source.fields": [ "id" ],
          "target.fields": [ "category_id" ]
        }
      }
    }
  }
}

另请参阅

概念 REST GraphQL 目的
投影 $select 物品 选择要返回的字段
Filtering $filter 滤波器 按条件限制行
排序 $orderby orderBy 定义排序顺序
页面大小 $first first 限制每页的项数
延续 $after 使用光标从最后一页继续

注释

REST 关键字以 $遵循 OData 约定开头。