Общий поиск в верхнем регистре на 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)));
}
...
}