Как указать условия WHERE при использовании метода readUsingIndex в Google Spanner - PullRequest
0 голосов
/ 09 января 2020

У меня есть следующие фрагменты кода из Документы Google Spanner

Как мне указать условия WHERE в этом?

Мне кажется, что мы может выполнять только обычный SELECT из этого условия и условия WHERE, применяемые при выполнении итерации ResultSet.

static void readStoringIndex(DatabaseClient dbClient) {

  // We can read MarketingBudget also from the index since it stores a copy of MarketingBudget.

  try (ResultSet resultSet = dbClient

          .singleUse()
          .readUsingIndex(
              "Albums",
              "AlbumsByAlbumTitle2",
              KeySet.all(),
              Arrays.asList("AlbumId", "AlbumTitle", "MarketingBudget"))) {
    while (resultSet.next()) {
      System.out.printf(
          "%d %s %s\n",
          resultSet.getLong(0),
          resultSet.getString(1),
          resultSet.isNull("MarketingBudget") ? "NULL" : resultSet.getLong("MarketingBudget"));
    }
  }
}

Ответы [ 2 ]

0 голосов
/ 13 января 2020

Если вы хотите иметь возможность указывать операторы WHERE в запросе вторичных индексов, вы можете переключиться на язык SQL.

SELECT AlbumId, AlbumTitle, MarketingBudget
FROM Albums@{FORCE_INDEX=AlbumsByAlbumTitle2} AS s
WHERE s.AlbumTitle = "Go, Go, Go";

Здесь я включу код из документации Cloud Spanner для Запрос с использованием параметра , к которому я добавил оператор WHERE.

static void queryWithParameter(DatabaseClient dbClient) {
  Statement statement =
      Statement.newBuilder(
              "SELECT AlbumId, AlbumTitle, MarketingBudget "
                  + "FROM Albums@{FORCE_INDEX=AlbumsByAlbumTitle2} AS s "
                  + "WHERE s.AlbumTitle = @title")
                  // here you add more conditionals statements
          .bind("title")
          .to("Go, Go, Go")
          .build();
  try (ResultSet resultSet = dbClient.singleUse().executeQuery(statement)) {
    while (resultSet.next()) {
      System.out.printf(
          "%d %s %s\n",
          resultSet.getLong("SingerId"),
          resultSet.getString("FirstName"),
          resultSet.getString("LastName"));
    }
  }
}

Другие методы включают:

0 голосов
/ 09 января 2020

При использовании метода readUsingIndex вы фильтруете строки, которые хотите прочитать, указав одно или несколько значений ключа индекса, которые вы хотите прочитать.

Предположим, что индекс AlbumsByAlbumTitle2 содержит столбец AlbumTitle и вы хотите читать альбомы с названиями ' Отличный альбом ' и ' Не очень хороший альбом '. Ваш вызов должен быть таким:

client
    .singleUse()
    .readUsingIndex(
        "Albums",
        "AlbumsByAlbumTitle2",
        KeySet.newBuilder()
            .addKey(Key.of("Great album"))
            .addKey(Key.of("Not so great album"))
            .build(),
        Arrays.asList("AlbumId", "AlbumTitle", "MarketingBudget"));

A KeySet также может быть диапазоном (начало / конец) или префиксом. Обратите внимание, что при использовании метода readUsingIndex вы указываете, что хотите использовать вторичный индекс для фильтрации строк. Это означает, что вы не можете фильтровать другие столбцы, кроме столбцов вторичного индекса.

...