Подтвердить что ты не робот

Нечувствительный к регистру и нечувствительный, как в SQLite

В SQLite можно изменить чувствительное к регистру поведение "LIKE" с помощью команд:

PRAGMA case_sensitive_like=ON;
PRAGMA case_sensitive_like=OFF;

Однако в моей ситуации я хотел бы выполнить запрос, часть которого чувствительна к регистру, а часть - нет. Например:

SELECT * FROM mytable
WHERE caseSensitiveField like 'test%'
AND caseInsensitiveField like 'g2%'

Возможно ли это?

4b9b3361

Ответ 1

Вы можете использовать ключевое слово UPPER в своем регистре, нечувствительном к регистру, а затем в верхнем регистре вашего утверждения. например.

SELECT * FROM mytable 
WHERE caseSensitiveField like 'test%' 
AND UPPER(caseInsensitiveField) like 'G2%'

Ответ 2

Используйте простые сравнения, которые по умолчанию чувствительны к регистру (если вы не объявили столбец COLLATE NOCASE):

SELECT *
FROM mytable 
WHERE caseSensitiveField >= 'test'
  AND caseSensitiveField <  'tesu'
  AND caseInsensitiveField LIKE 'g2%'

Это работает, только если исходный LIKE выполняет поиск префикса, но позволяет использовать индекс.

Ответ 3

Я знаю, что это старый вопрос, но если вы кодируете на Java и имеете эту проблему, это может быть полезно. Вы можете зарегистрировать функцию, которая обрабатывает подобную проверку. Я получил сообщение от этой записи: fooobar.com/questions/201332/...

Решение я зависит от sqlite jdbc: https://mvnrepository.com/artifact/org.xerial/sqlite-jdbc

В моем случае мне нужно было увидеть, существует ли определенная строка как часть другой строки (например, "% mystring%" ), поэтому я создал функцию Contains, но ее можно расширить, чтобы сделать более sql например, с помощью регулярного выражения или что-то в этом роде.

Чтобы использовать функцию в 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());
}

Ответ 4

Для выполнения чувствительных к регистру запросов для столбца, созданного с помощью COLLATE NOCASE, используйте COLLATE BINARY:

select * from myTable where name like 'Test%' COLLATE BINARY;