Регистр чувствителен и нечувствителен, как в SQLite
в SQLite можно изменить чувствительное к регистру поведение "LIKE" с помощью команд:
PRAGMA case_sensitive_like=ON;
PRAGMA case_sensitive_like=OFF;
однако в моей ситуации я хотел бы выполнить запрос, часть которого чувствительна к регистру, а часть-нет. Например:
SELECT * FROM mytable
WHERE caseSensitiveField like 'test%'
AND caseInsensitiveField like 'g2%'
это возможно?
4 ответов
вы можете использовать ключевое слово UPPER в поле без учета регистра, а затем в верхнем регистре оператор like. например,
SELECT * FROM mytable
WHERE caseSensitiveField like 'test%'
AND UPPER(caseInsensitiveField) like 'G2%'
используйте простые сравнения, которые по умолчанию чувствительны к регистру (если вы не объявили столбец COLLATE NOCASE
):
SELECT *
FROM mytable
WHERE caseSensitiveField >= 'test'
AND caseSensitiveField < 'tesu'
AND caseInsensitiveField LIKE 'g2%'
это работает только в том случае, если оригинал LIKE
ищет префикс, но позволяет использовать индекс.
Я знаю, что это старый вопрос, но если вы кодируете на Java и имеете эту проблему, это может быть полезно. Вы можете зарегистрировать функцию, которая обрабатывает как проверка. Я получил подсказку от этого сообщения:https://stackoverflow.com/a/29831950/1271573
решение I зависит от sqlite jdbc:https://mvnrepository.com/artifact/org.xerial/sqlite-jdbc
в моем случае мне нужно было только увидеть, существует ли определенная строка как часть другой string (например, " %mystring%"), поэтому я создал функцию Contains, но ее можно расширить, чтобы сделать более sql-подобную проверку с помощью regex или чего-то еще.
чтобы использовать функцию в SQL, чтобы увидеть, содержит ли MyCol "searchstring", вы бы сделали:
select * from mytable where Contains(MyCol, 'searchstring')
вот моя содержит функцию:
public class Contains extends Function {
@Override
protected void xFunc() throws SQLException {
if (args() != 2) {
throw new SQLException("Contains(t1,t2): Invalid argument count. Requires 2, but found " + args());
}
String testValue = value_text(0).toLowerCase();
String isLike = value_text(1).toLowerCase();
if (testValue.contains(isLike)) {
result(1);
} else {
result(0);
}
}
}
чтобы использовать эту функцию, вы должны сначала зарегистрировать ее. Когда вы сделали с помощью его можно уничтожить. Вот как:
public static void registerContainsFunc(Connection con) throws SQLException {
Function.create(con, Contains.class.getSimpleName(), new Contains());
}
public static void destroyContainsFunc(Connection con) throws SQLException {
Function.destroy(con, Contains.class.getSimpleName());
}
чтобы выполнить запросы с учетом регистра для столбца, созданного с помощью COLLATE NOCASE, используйте COLLATE BINARY:
select * from myTable where name like 'Test%' COLLATE BINARY;