7.15.1. between#

7.15.1.1. 概要#

between は、指定された値が指定された範囲にあるかをチェックするために使われます。これは selectfilter オプションと組み合わせてよく使われます。

7.15.1.2. 構文#

between は3つから6つの引数を受け取ります。

between(column_or_value, min, max)
between(column_or_value, min, max, {"option": "value of option"})
between(column_or_value, min, min_border, max, max_border)
between(column_or_value, min, min_border, max, max_border, {"option": "value of option"})

7.15.1.3. 使い方#

使い方を示すために使うスキーマ定義とサンプルデータは以下の通りです。

実行例:

table_create Users TABLE_HASH_KEY ShortText
# [[0,1337566253.89858,0.000355720520019531],true]
column_create Users age COLUMN_SCALAR Int32
# [[0,1337566253.89858,0.000355720520019531],true]
table_create Ages TABLE_HASH_KEY Int32
# [[0,1337566253.89858,0.000355720520019531],true]
column_create Ages user_age COLUMN_INDEX Users age
# [[0,1337566253.89858,0.000355720520019531],true]
load --table Users
[
{"_key": "Alice",  "age": 12},
{"_key": "Bob",    "age": 13},
{"_key": "Calros", "age": 15},
{"_key": "Dave",   "age": 16},
{"_key": "Eric",   "age": 20},
{"_key": "Frank",  "age": 21}
]
# [[0,1337566253.89858,0.000355720520019531],6]

これはPG-13 (MPAA)のレーティングに該当する人を示すクエリです。

実行例:

select Users --filter 'between(age, 13, "include", 16, "include")'
# [
#   [
#     0,
#     1337566253.89858,
#     0.000355720520019531
#   ],
#   [
#     [
#       [
#         3
#       ],
#       [
#         [
#           "_id",
#           "UInt32"
#         ],
#         [
#           "_key",
#           "ShortText"
#         ],
#         [
#           "age",
#           "Int32"
#         ]
#       ],
#       [
#         2,
#         "Bob",
#         13
#       ],
#       [
#         3,
#         "Calros",
#         15
#       ],
#       [
#         4,
#         "Dave",
#         16
#       ]
#     ]
#   ]
# ]

13から16歳までのユーザーを返します。

between 関数はテーブルのカラムだけでなく、値も受け付けます。

最初の引数に値を指定した場合、その値が含まれているか否かをチェックします。もし、指定した範囲にマッチしたら、( between 関数がtrueを返すので)すべてのレコードを返します。もし、指定した範囲にマッチしなかった場合、( between 関数がfalseを返すので)1件もレコードを返しません。

実行例:

select Users --filter 'between(14, 13, "include", 16, "include")'
# [
#   [
#     0,
#     1337566253.89858,
#     0.000355720520019531
#   ],
#   [
#     [
#       [
#         6
#       ],
#       [
#         [
#           "_id",
#           "UInt32"
#         ],
#         [
#           "_key",
#           "ShortText"
#         ],
#         [
#           "age",
#           "Int32"
#         ]
#       ],
#       [
#         1,
#         "Alice",
#         12
#       ],
#       [
#         2,
#         "Bob",
#         13
#       ],
#       [
#         3,
#         "Calros",
#         15
#       ],
#       [
#         4,
#         "Dave",
#         16
#       ],
#       [
#         5,
#         "Eric",
#         20
#       ],
#       [
#         6,
#         "Frank",
#         21
#       ]
#     ]
#   ]
# ]

上記の例では、すべてのレコードを返します。これは、14は指定した範囲である13から16の間にあるからです。この振舞いは指定した値がテーブルに存在するかどうかの確認に使えます。

また、 between はオプションも指定できます。現在は、 too_many_index_match_ratio のみ指定できます。この値は、 double 型です。

too_many_index_match_ratio を使って、 GRN_BETWEEN_TOO_MANY_INDEX_MATCH_RATIO の値を変更できます。GRN_BETWEEN_TOO_MANY_INDEX_MATCH_RATIO のデフォルト値は 0.01 です。GRN_BETWEEN_TOO_MANY_INDEX_MATCH_RATIO は、 between がインデックスを使うかどうかを決定するために使います。

between とANDで絞り込むと予想されるレコード数よりも、絞り込んだレコード数が十分に小さい場合は、インデックスを使った検索より、シーケンシャルサーチの方が速いことがあります。

例えば、 --filter でレコードを絞り込んだあと、さらに between で絞り込むとします。

デフォルトでは、以下のケースでは、 between はシーケンシャルサーチを使います。

  1. --filter で絞り込んだレコード数が1000で between 対象のレコード数が500,000の場合。

    1,000/500,000 = 0.002 < 0.01(GRN_BETWEEN_TOO_MANY_INDEX_MATCH_RATIO) -> between use sequential search.
    

一方、以下のケースでは、 between はインデックスを使います。

  1. --filter で絞り込んだレコード数が1000で between 対象のレコード数が50,000の場合。

    1,000/50,000 = 0.02 > 0.01(GRN_BETWEEN_TOO_MANY_INDEX_MATCH_RATIO) -> between use index.
    

between のオプションを設定するクエリーは以下の通りです。:

実行例:

select Users --filter 'between(age, 13, "include", 16, "include", {"too_many_index_match_ratio":0.001})'
# [
#   [
#     0,
#     1337566253.89858,
#     0.000355720520019531
#   ],
#   [
#     [
#       [
#         3
#       ],
#       [
#         [
#           "_id",
#           "UInt32"
#         ],
#         [
#           "_key",
#           "ShortText"
#         ],
#         [
#           "age",
#           "Int32"
#         ]
#       ],
#       [
#         2,
#         "Bob",
#         13
#       ],
#       [
#         3,
#         "Calros",
#         15
#       ],
#       [
#         4,
#         "Dave",
#         16
#       ]
#     ]
#   ]
# ]

7.15.1.4. 引数#

7.15.1.4.1. 必須引数#

必須引数は3つあります。 column_or_valueminmax です。

7.15.1.4.1.1. column_or_value#

カラムもしくは値を指定します。

7.15.1.4.1.2. min#

範囲のうち最小値を指定します。デフォルトでは min を範囲に含めますが、 min_border 引数で含めるかどうかを制御できます。

7.15.1.4.1.3. max#

範囲のうち最大値を指定します。デフォルトでは値 max を範囲に含めますが、 max_border 引数で含めるかどうかを制御できます。

7.15.1.4.2. 省略可能引数#

省略可能引数は2つあります。 min_bordermax_border です。

7.15.1.4.2.1. min_border#

min の値を含めた範囲となるかどうかを指定します。 min_border に指定できるのは "include" または "exclude" のどちらかです。 "include" を指定すれば、min が含まれます。 "exclude" を指定すれば min は含まれません。

7.15.1.4.2.2. max_border#

man の値を含めた範囲となるかどうかを指定します。 max_border に指定できるのは "include" または "exclude" のどちらかです。 "include" を指定すれば、max が含まれます。 "exclude" を指定すれば max は含まれません。

7.15.1.4.2.3. {"option": "value of option"}#

between のオプションを指定します。現在は、 too_many_index_match_ratio のみ指定できます。この値は、 double 型です。

7.15.1.4.2.4. 戻り値#

between は指定した範囲にカラムの値が含まれるかを返します。もし該当するレコードがあれば、 true を返します。そうでなければ false を返します。