すべてのプロダクト
Search
ドキュメントセンター

Tablestore:フィルター

最終更新日:Apr 01, 2026

Tablestore では、フィルターを使用して、指定した条件に基づいてクエリ結果を絞り込むことができます。このトピックでは、Go SDK でフィルターを使用する方法について説明します。

前提条件

Tablestore クライアントの初期化

フィルターのタイプ

Tablestore は、次の 3 種類のフィルターをサポートしています。

  • 単一列の値フィルター (SingleColumnCondition):単一の属性列の値が条件を満たすかどうかをチェックします。

  • 単一列の値の正規表現フィルター (SingleColumnValueRegexFilter):文字列型の属性列に正規表現を適用して部分文字列を抽出し、キャストしてから、条件を満たすかどうかをチェックします。

  • 複合フィルター (CompositeColumnCondition):複数のフィルター条件を組み合わせてデータをフィルタリングします。

単一列の値フィルター

func NewSingleColumnCondition(columnName string, comparator ComparatorType, value interface{}) *SingleColumnCondition

パラメーター

パラメーター

説明

Comparator (必須)

ComparatorType

関係演算子。有効な値は、`CT_EQUAL` (等しい)、`CT_NOT_EQUAL` (等しくない)、`CT_GREATER_THAN` (より大きい)、`CT_GREATER_EQUAL` (以上)、`CT_LESS_THAN` (より小さい)、`CT_LESS_EQUAL` (以下) です。

ColumnName (必須)

string

評価対象の属性列の名前。

ColumnValue (必須)

interface{}

比較対象の値。

FilterIfMissing (任意)

bool

指定された属性列がない行をフィルターで除外するかどうかを決定します。デフォルト値は false で、この場合、行は返されます。

LatestVersionOnly (任意)

bool

属性列の最新のデータバージョンのみを評価するかどうかを決定します。デフォルト値は false です。false に設定し、複数のデータバージョンが存在する場合、いずれかのバージョンが条件に一致すれば、その行は条件を満たすと見なされます。

サンプルコード

このサンプルコードは、プライマリキーが [`row1`, `row3`) の範囲にある行に対して範囲クエリを実行し、その結果をフィルター処理して、`col1` 属性列の値が val1 に等しい行のみを返す方法を示しています。

func SingleValueFilterSample(client *tablestore.TableStoreClient) {
    // クエリ条件を構築します。
    rangeRowQueryCriteria := &tablestore.RangeRowQueryCriteria{}
    rangeRowQueryCriteria.TableName = "test_table"
    // 開始プライマリキーを設定します。
    startPK := new(tablestore.PrimaryKey)
    startPK.AddPrimaryKeyColumn("id", "row1")
    rangeRowQueryCriteria.StartPrimaryKey = startPK
    // 終了プライマリキーを設定します。このキーを持つ行は結果に含まれません。
    endPK := new(tablestore.PrimaryKey)
    endPK.AddPrimaryKeyColumn("id", "row3")
    rangeRowQueryCriteria.EndPrimaryKey = endPK
    // クエリするバージョン数を設定します。
    rangeRowQueryCriteria.MaxVersion = 1

    // col1 が "val1" に等しいというフィルターを構築します。
    singleColumnCondition := tablestore.NewSingleColumnCondition("col1", tablestore.CT_EQUAL, "val1")
    rangeRowQueryCriteria.Filter = singleColumnCondition

    // GetRange 操作を呼び出してデータをクエリします。
    getRangeRequest := new(tablestore.GetRangeRequest)
    getRangeRequest.RangeRowQueryCriteria = rangeRowQueryCriteria
    getRangeResponse, err := client.GetRange(getRangeRequest)

    // 応答を処理します。
    if err != nil {
        fmt.Println("Range get failed with error: ", err)
    } else {
        fmt.Printf("* RequestId: %s \n", getRangeResponse.RequestId)
        fmt.Printf("* Read CU Cost: %d \n", getRangeResponse.ConsumedCapacityUnit.Read)
        fmt.Printf("* Write CU Cost: %d \n", getRangeResponse.ConsumedCapacityUnit.Write)
        fmt.Println("* Rows Data:")
        for _, row := range getRangeResponse.Rows {
            fmt.Printf("PrimaryKey: %v; Columns: ", row.PrimaryKey.PrimaryKeys)
            for _, column := range row.Columns {
                fmt.Printf("%v ", column)
            }
            fmt.Printf("\n")
        }
    }
}
  • 指定された属性列が含まれていない行をフィルターで除外するには、`FilterIfMissing` パラメーターを `true` に設定します。

    singleColumnCondition.FilterIfMissing = true
  • 属性列の最新のデータバージョンのみを評価するには、`LatestVersionOnly` パラメーターを `true` に設定します。

    singleColumnCondition.LatestVersionOnly = true

単一列の値の正規表現フィルター

このフィルターは、文字列型の属性列にのみ適用できます。

func NewSingleColumnValueRegexFilter(columnName string, comparator ComparatorType, rule *ValueTransferRule, value interface{}) *SingleColumnCondition

パラメーター

パラメーター

説明

Comparator (必須)

ComparatorType

関係演算子。有効な値は、`CT_EQUAL` (等しい)、`CT_NOT_EQUAL` (等しくない)、`CT_GREATER_THAN` (より大きい)、`CT_GREATER_EQUAL` (以上)、`CT_LESS_THAN` (より小さい)、`CT_LESS_EQUAL` (以下) です。

ColumnName (必須)

string

評価対象の属性列の名前。

ColumnValue (必須)

interface{}

比較対象の値。

TransferRule (必須)

ValueTransferRule

正規表現のマッチングルール。次のパラメーターが含まれます。

  • Regex (必須) string:部分文字列を照合するための正規表現。式は 256 バイトを超えてはなりません。

    • PCRE (Perl 互換正規表現) とシングルバイト正規表現がサポートされています。

    • 正規表現での中国語文字の照合はサポートされていません。

    • グループ化構文がサポートされています。式にキャプチャグループが含まれている場合、最初に一致した部分文字列が返されます。たとえば、列の値が 1aaa51bbb5 で、式が 1([a-z]+)5 の場合、返される部分文字列は aaa です。

  • Cast_type (必須) VariantType:一致した部分文字列がキャストされるデータの型。有効な値:`Variant_INTEGER` (整数)、`Variant_DOUBLE` (倍精度浮動小数点)、`Variant_STRING` (文字列)。

サンプルコード

次のサンプルコードは、プライマリキーが [`row1`, `row3`) の範囲にある行に対して範囲クエリを実行する方法を示しています。次に、正規表現フィルターを適用して、`col1` 属性列の値が式 1([a-z]+)5 に一致し、キャプチャされた部分文字列が aaa である行のみを返します。

func SingleRegexFilterSample(client *tablestore.TableStoreClient) {
    // クエリ条件を構築します。
    rangeRowQueryCriteria := &tablestore.RangeRowQueryCriteria{}
    rangeRowQueryCriteria.TableName = "test_table"
    // 開始プライマリキーを設定します。
    startPK := new(tablestore.PrimaryKey)
    startPK.AddPrimaryKeyColumn("id", "row1")
    rangeRowQueryCriteria.StartPrimaryKey = startPK
    // 終了プライマリキーを設定します。このキーを持つ行は結果に含まれません。
    endPK := new(tablestore.PrimaryKey)
    endPK.AddPrimaryKeyColumn("id", "row3")
    rangeRowQueryCriteria.EndPrimaryKey = endPK
    // クエリするバージョン数を設定します。
    rangeRowQueryCriteria.MaxVersion = 1

    // フィルターを構築します:cast<String>(reg(col1)) == "aaa"
    valueTransferRule := tablestore.NewValueTransferRule("1([a-z]+)5", tablestore.Variant_STRING)
    singleColumnValueRegexFilter := tablestore.NewSingleColumnValueRegexFilter("col1", tablestore.CT_EQUAL, valueTransferRule, "aaa")
    rangeRowQueryCriteria.Filter = singleColumnValueRegexFilter

    // GetRange 操作を呼び出してデータをクエリします。
    getRangeRequest := new(tablestore.GetRangeRequest)
    getRangeRequest.RangeRowQueryCriteria = rangeRowQueryCriteria
    getRangeResponse, err := client.GetRange(getRangeRequest)

    // 応答を処理します。
    if err != nil {
        fmt.Println("Range get failed with error: ", err)
    } else {
        fmt.Printf("* RequestId: %s \n", getRangeResponse.RequestId)
        fmt.Printf("* Read CU Cost: %d \n", getRangeResponse.ConsumedCapacityUnit.Read)
        fmt.Printf("* Write CU Cost: %d \n", getRangeResponse.ConsumedCapacityUnit.Write)
        fmt.Println("* Rows Data:")
        for _, row := range getRangeResponse.Rows {
            fmt.Printf("PrimaryKey: %v; Columns: ", row.PrimaryKey.PrimaryKeys)
            for _, column := range row.Columns {
                fmt.Printf("%v ", column)
            }
            fmt.Printf("\n")
        }
    }
}

複合フィルター

複合フィルターは最大 32 個の条件を組み合わせることができます。

func NewCompositeColumnCondition(lo LogicalOperator) *CompositeColumnCondition

パラメーター

パラメーター

説明

Operator (必須)

LogicalOperator

論理演算子。有効な値は、`LO_NOT` (not)、`LO_AND` (and)、`LO_OR` (or) です。

Filters (必須)

[]ColumnFilter

論理演算子を使用して結合するフィルター。フィルターには、SingleColumnCondition フィルター、SingleColumnValueRegexFilter フィルター、またはネストされた他の CompositeColumnCondition フィルターを指定できます。

サンプルコード

このサンプルコードは、プライマリキーが [`row1`, `row3`) の範囲にある行に対して範囲クエリを実行し、複合フィルターを使用して結果を絞り込む方法を示しています。

func CompositeFilterSample(client *tablestore.TableStoreClient) {
    // クエリ条件を構築します。
    rangeRowQueryCriteria := &tablestore.RangeRowQueryCriteria{}
    rangeRowQueryCriteria.TableName = "test_table"
    // 開始プライマリキーを設定します。
    startPK := new(tablestore.PrimaryKey)
    startPK.AddPrimaryKeyColumn("id", "row1")
    rangeRowQueryCriteria.StartPrimaryKey = startPK
    // 終了プライマリキーを設定します。このキーを持つ行は結果に含まれません。
    endPK := new(tablestore.PrimaryKey)
    endPK.AddPrimaryKeyColumn("id", "row3")
    rangeRowQueryCriteria.EndPrimaryKey = endPK
    // クエリするバージョン数を設定します。
    rangeRowQueryCriteria.MaxVersion = 1

    // 最初の単一列の値フィルターを構築します:col1 == "val1"
    singleColumnCondition1 := tablestore.NewSingleColumnCondition("col1", tablestore.CT_EQUAL, "val1")
    // 単一列の正規表現フィルターを構築します:cast<String>(reg(col2)) == "aaa"
    valueTransferRule := tablestore.NewValueTransferRule("1([a-z]+)5", tablestore.Variant_STRING)
    singleColumnValueRegexFilter2 := tablestore.NewSingleColumnValueRegexFilter("col2", tablestore.CT_EQUAL, valueTransferRule, "aaa")
    // 最初の複合フィルターを構築します:col1 == "val1" OR cast<String>(reg(col2)) == "aaa"
    compositeCondition1 := tablestore.NewCompositeColumnCondition(tablestore.LO_OR)
    compositeCondition1.AddFilter(singleColumnCondition1)
    compositeCondition1.AddFilter(singleColumnValueRegexFilter2)
    // 2 番目の単一列の値フィルターを構築します:col3 == "val3"
    singleColumnCondition3 := tablestore.NewSingleColumnCondition("col3", tablestore.CT_EQUAL, "val3")
    // 最終的な複合フィルターを構築します:(col1 == "val1" OR cast<String>(reg(col2)) == "aaa") AND col3 == "val3"
    compositeCondition2 := tablestore.NewCompositeColumnCondition(tablestore.LO_AND)
    compositeCondition2.AddFilter(compositeCondition1)
    compositeCondition2.AddFilter(singleColumnCondition3)

    // フィルターをクエリに追加します。
    rangeRowQueryCriteria.Filter = compositeCondition2

    // GetRange 操作を呼び出してデータをクエリします。
    getRangeRequest := new(tablestore.GetRangeRequest)
    getRangeRequest.RangeRowQueryCriteria = rangeRowQueryCriteria
    getRangeResponse, err := client.GetRange(getRangeRequest)

    // 応答を処理します。
    if err != nil {
        fmt.Println("Range get failed with error: ", err)
    } else {
        fmt.Printf("* RequestId: %s \n", getRangeResponse.RequestId)
        fmt.Printf("* Read CU Cost: %d \n", getRangeResponse.ConsumedCapacityUnit.Read)
        fmt.Printf("* Write CU Cost: %d \n", getRangeResponse.ConsumedCapacityUnit.Write)
        fmt.Println("* Rows Data:")
        for _, row := range getRangeResponse.Rows {
            fmt.Printf("PrimaryKey: %v; Columns: ", row.PrimaryKey.PrimaryKeys)
            for _, column := range row.Columns {
                fmt.Printf("%v ", column)
            }
            fmt.Printf("\n")
        }
    }
}

関連トピック