高度なクエリの実行

OData では、高度なリクエストを作成できるように以下のクエリオプションを定義しています。

  • $filter

  • $select

  • $orderby

  • $expand

選択: $filter

$filter システムクエリオプションを使用した URI は、 $filter 述語式を満たすコレクションのエンティティの一部を特定します。

式ではプロパティとリテラルを参照できます。リテラルには、文字列 (一重引用符で囲んで記述)、 null リテラル、数値、または boolean 値を使用できます。

このサービスでは、以下の演算と関数をサポートしています。

演算子

演算子

説明

eq

等しい

/actor?$filter=first_name eq 'GRACE'

ne

等しくない

/actor?$filter=first_name ne 'GRACE'

gt

より大きい

/actor?$filter=actor_id gt 5

ge

以上

/actor?$filter=actor_id ge 5

lt

より小さい

/actor?$filter=actor_id lt 10

le

以下

/actor?$filter=actor_id le 10

and

論理積

/actor?$filter=actor_id gt 5 and actor_id lt 10

or

論理和

/actor?$filter=actor_id lt 5 or first_name eq 'GRACE'

not

論理否定

/actor?$filter=not (actor_id eq 1)

add

加算

/film?$filter=length add 30 gt 180

sub

減算

/film?$filter=length sub 30 gt 120

mul

乗算

/film?$filter=length mul 2 ge 300

div

除算

/film?$filter=length div 3 eq 60

mod

剰余

/film?$filter=length mod 10 eq 8

()

優先順位グループ

/actor?$filter=actor_id lt 7 and (first_name eq 'NICK' or actor_id gt 3)

文字列関数

文字列演算では、以下の各関数を使用できます。

  • contains(string p0, string p1): p0 で指定したプロパティ名の値に文字列 p1 が使用されていれば true 、使用されていなければ false が返されます。

  • startswith(string p0, string p1): p0 で指定したプロパティ名の値が文字列 p1 で始まる場合は true 、それ以外の場合は false が返されます。

  • endswith(string p0, string p1): p0 で指定したプロパティ名の値が文字列 p1 で終わる場合は true 、それ以外の場合は false が返されます。

  • indexof(string p0, string p1): p0 で指定したプロパティ名の値の中で文字列 p1 が占める位置が返されます。

  • length(p0): p0 で指定したプロパティ名の値の長さが返されます。

  • substring(string p0, int pos): p0 で指定したプロパティ名の値の部分文字列が新しい文字列として返されます。この部分文字列は、 pos で指定した位置にある文字から文字列末尾までの文字列です。

  • substring(string p0, int pos, int length): p0 で指定したプロパティ名の値の部分文字列が新しい文字列として返されます。この部分文字列は、 pos で指定した位置にある文字から pos + length の位置にある文字までの文字列です。

  • tolower(string p0): p0 で指定したプロパティ名の値を小文字に変換した文字列が返されます。

  • toupper(string p0): p0 で指定したプロパティ名の値を大文字に変換した文字列が返されます。

  • trim(string p0): p0 で指定したプロパティ名の値から先頭と末尾の空白を削除した文字列が返されます。

  • concat(string p0, string p1): 文字列 p0 と文字列 p1 を連結した新しい文字列が返されます。

上記の関数の概要と使用例を以下の表に示します。

関数

bool contains(string p0, string p1)

/actor?$filter=contains(first_name, 'LO')

bool startswith(string p0, string p1)

/actor?$filter=startswith(first_name, 'JO')

bool endswith(string p0, string p1)

/actor?$filter=endswith(first_name,'ER')

int indexof(string p0, string p1)

/actor?$filter=indexof(last_name, 'LO') eq 3

int length(string p0)

/actor?$filter=length(first_name) eq 4

string substring(string p0, int pos)

/actor?$filter=substring(first_name, 2) eq 'RO'

string substring(string p0, int pos, int length)

/actor?$filter=substring(first_name, 2,3) eq 'TTH'

string tolower(string p0)

/actor?$filter=tolower(first_name) eq 'nick'

string toupper(string p0)

/actor?$filter=toupper(first_name) eq 'NICK'

string trim(string p0)

/actor?$filter=trim(first_name) eq 'JENNIFER'

string concat(string p0, string p1)

/actor?$filter=concat( concat(first_name,', '), last_name)  eq 'JENNIFER, DAVIS'

数学関数

数学関数として roundfloorceiling の 3 つがあります。それぞれにパラメーターとして Double 型または Decimal 型の値を指定でき、そのパラメーターと同じ型の戻り値が返されます。

関数

round

/film?$filter=round(replacement_cost) eq 21

floor

/film?$filter=floor(replacement_cost) eq 20

ceiling

/film?$filter=ceiling(replacement_cost) eq 21

日付関数

関数

int year(DateTimeOffset p0) int year(Date p0)

/actor?$filter=year(last_update) eq 2016

int month(DateTimeOffset p0) int month(Date p0)

/actor?$filter=month(last_update) eq 12

int day(DateTimeOffset p0) int day(Date p0)

/actor?$filter=day(last_update) eq 31

int hour(DateTimeOffset p0) int hour(TimeOfDay p0)

/actor?$filter=hour(last_update) eq 3

int minute(DateTimeOffset p0) int minute(TimeOfDay p0)

/actor?$filter=minute(last_update) eq 34

int second(DateTimeOffset p0) int second(TimeOfDay p0)

/actor?$filter=second(last_update) eq 33

DateTimeOffset now()

/actor?$filter=last_update lt now()

投影: $select

$select システムクエリオプションを指定すると、明示的に要求したプロパティのみが返されます。 $select 式には、プロパティのカンマ区切りリストまたはアスタリスク演算子 (*) を指定できます。アスタリスク演算子を使用すると、すべてのプロパティが取得されます。

例:

/denodo-odata.svc/movies/actor?$select=actor_id,first_name,last_name

応答:

{
  "@odata.context":"/denodo-odata.svc/movies/$metadata#actor(actor_id,first_name,last_name)",
  "value": [
    {
      "actor_id": 1,
      "first_name": "PENELOPE",
      "last_name": "GUINESS"
    },

    ...
  ]
}

例:

/denodo-odata.svc/movies/actor?$select=*

応答:

{
  "@odata.context": "/denodo-odata.svc/movies/$metadata#actor(*)",
  "value": [
    {
      "actor_id": 1,
      "first_name": "PENELOPE",
      "last_name": "GUINESS",
      "last_update": "2006-02-15T11:34:33Z"
    },

    ...
  ]
}

注釈

$select 式では複合プロパティを指定できます。

denodo-odata.svc/admin/struct_table_film?$select=film_data/title

応答:

{
  "@odata.context":"/denodo-odata.svc/admin/$metadata
                                #struct_table_film(film_data/title)",
  "value": [
    {
      "@odata.id": "/denodo-odata.svc/admin/struct_table_film(1)",
      "film_data": {
        "title": "ACADEMY DINOSAUR"
      }

      ...
   }
   ...
   ]
  }

結果の並べ替え: $orderby

$orderby クエリパラメーターは、アイテムが返される順序を指定します。

/denodo-odata.svc/<database name>/collectionName?$orderby=attribute [asc|desc]

コレクションを並べ替えるには、リソースパスでエントリのコレクションを指定する必要があります。指定しないと、このオプションを使用できません。

キーワードの ascdesc は、並べ替えの方向 (それぞれ昇順と降順) を指定します。 ascdesc も指定していない場合、アイテムは昇順で返されます。昇順の場合、Null 値は Null 以外の値よりも前に置かれ、降順の場合はその逆の順序になります。

複数の属性を基準として並べ替えることもできます。

/denodo-odata.svc/<database name>/collectionName?$orderby=attribute1 [asc|desc],attribute2 [asc|desc]

例:

/denodo-odata.svc/movies/address?$orderby=zip,client_identifier desc

パラメーターの別名

パラメーターの別名は、 @ 記号を接頭辞とする識別子です。クエリの式に使用することで、同じリテラルを何回も記述する必要がなくなる、長いリテラルを読みやすい位置に記述できるなどの利点があります。

例:

/denodo-odata.svc/movies/film?$filter=contains(title,@p1) and not contains(description,@p1)&@p1='ACADEMY DINOSAUR'

結果の最大数の指定: $top

$top オプションを使用すると、コレクションの先頭から n 件のエントリを選択できます。 n は負数ではない整数です。

/denodo-odata.svc/<database name>/collectionName?$top=n

例:

/denodo-odata.svc/movies/actor?$top=1

応答:

{
  "@odata.context": "/denodo-odata.svc/movies/$metadata#actor",
  "value": [
    {
      "actor_id": 1,
      "first_name": "PENELOPE",
      "last_name": "GUINESS",
      "last_update": "2006-02-15T11:34:33Z"
    }
  ]
}

オフセットの指定: $skip

$skip オプションを使用すると、コレクションの先頭から n 件のエントリが応答に表示されません。 n は負数ではない整数です。

denodo-odata.svc/<database name>/collectionName?$skip=n

例:

/denodo-odata.svc/movies/actor?$skip=199

応答:

{
  "@odata.context": "/denodo-odata.svc/movies/$metadata#actor",
  "value": [
    {
      "actor_id": 200,
      "first_name": "THORA",
      "last_name": "TEMPLE",
      "last_update": "2006-02-15T11:34:33Z"
    }
  ]
}

結果の総数の要求: $count

$count システムクエリオプションを指定すると、応答で返されるアイテムの数が結果と共に返されます。

以前の構文 $inlinecount=allpages が、OData 4 では短縮されて $count=true になっています。

$count システムクエリオプションでは、 $top$skip 、および $expand の各クエリオプションが無視され、指定した $filter に一致する結果のみで構成されたページのすべてにわたり、そこに存在する結果の総数が返されます。

例:

/denodo-odata.svc/movies/actor?$count=true

応答:

{
  "@odata.context": "/denodo-odata.svc/movies/$metadata#actor",
  "@odata.count": 200,
  "value": [
    {
      "actor_id": 1,
      "first_name": "PENELOPE",
      "last_name": "GUINESS",
      "last_update": "2006-02-15T11:34:33Z"
    },
...
]
}

例:

/denodo-odata.svc/movies/actor?$count=true&$filter=actor_id eq 1

応答:

{
  "@odata.context": "/denodo-odata.svc/movies/$metadata#actor",
  "@odata.count": 1,
  "value": [
    {
      "actor_id": 1,
      "first_name": "PENELOPE",
      "last_name": "GUINESS",
      "last_update": "2006-02-15T11:34:33Z"
    }
  ]
}

例:

/denodo-odata.svc/movies/actor?$count=false

応答:

$count オプションを指定していないリクエストと同じ actor データ:

 {
   "@odata.context": "/denodo-odata.svc/movies/$metadata#actor",
   "value": [
     {
       "actor_id": 1,
       "first_name": "PENELOPE",
       "last_name": "GUINESS",
       "last_update": "2006-02-15T11:34:33Z"
     },
 ...
 ]
}