Общий поиск в верхнем регистре на Postgres и MySQL не работает

Я пытаюсь сделать легкий поиск по таблице, которая может быть в любой базе данных. Следующий запрос работает с большинством баз данных, но я не могу найти решение, которое работает на MySQL. Таблицы в моей базе данных генерируются средой активных объектов, поэтому я не могу изменить имена или конфигурацию этих экземпляров.

Вот запрос, который отлично работает на всех базах данных, кроме MySQL:

выберите * из "AO_69D057_FILTER", где "SHARED" = true и "CONTAINS_PROJECT" = true и UPPER("FILTER_NAME"), как UPPER ('% pr%').

MySql по какой-то причине не может использовать имя таблицы в двойных кавычках. Если я использую имя таблицы без кавычек, это работает на MySQL, но не на Postgres. Postgres преобразует имя таблицы в нижний регистр, потому что оно не заключено в кавычки. АО генерирует имена таблиц в верхнем регистре.

Я также пытался использовать псевдоним, но это не может работать из-за иерархии оценки оператора.

Любые предложения, как избавиться от проблемы с именем таблицы?

2 ответа

Решение

По умолчанию двойные кавычки используются для столбцов. Вы можете изменить это:

SET SQL_MODE = ANSI_QUOTES;

Вот документация об этом: http://dev.mysql.com/doc/refman/5.7/en/sql-mode.html

У меня такая же проблема. Я выбираю запрос в соответствии с полученным исключением. При первом вызове поиска в базе данных я пробую без кавычек, если это не удается, я пытаюсь использовать кавычки. Затем я соответствующим образом устанавливаю переменную useQueryWithQuotes, чтобы в будущих вызовах мне не нужно было проверять исключение. Ниже приведен фрагмент кода, который я использую.

      private Boolean useQueryWithQuotes=null;
private final String queryWithQuotes = "\"OWNER\"=? or \"PRIVATE\"=?";
private final String queryWithoutQuotes = "OWNER=? or PRIVATE=?";

public Response getReports() {
  List<ReportEntity> reports = null;
  if(useQueryWithQuotes==null){
    synchronized(this){
      try {
        reports = new ArrayList<ReportEntity>( Arrays.asList(ao.find(ReportEntity.class, Query.select().where(queryWithoutQuotes, getUserKey(), false))) );
        useQueryWithQuotes = false;
      } catch (net.java.ao.ActiveObjectsException e) {
        log("exception:" + e);
        log("trying query with quotes");
        reports = new ArrayList<ReportEntity>(  Arrays.asList(ao.find(ReportEntity.class, queryWithQuotes, getUserKey(), false)));
        useQueryWithQuotes = true;
      }
    }
  }else{
    String query = useQueryWithQuotes ? queryWithQuotes : queryWithoutQuotes;
    reports = new ArrayList<ReportEntity>(  Arrays.asList(ao.find(ReportEntity.class, query, getUserKey(), false)));
  }
  ...
}
Другие вопросы по тегам