在 SQLite 中,可以使用以下命令更改“LIKE”区分大小写的行为:
PRAGMA case_sensitive_like=ON;
PRAGMA case_sensitive_like=OFF;
但是在我的情况下,我想执行一个查询,其中一部分区分大小写,一部分不区分大小写。例如:
SELECT * FROM mytable
WHERE caseSensitiveField like 'test%'
AND caseInsensitiveField like 'g2%'
这可能吗?
您可以在不区分大小写的字段上使用 UPPER 关键字,然后将 like 语句大写。例如
SELECT * FROM mytable
WHERE caseSensitiveField like 'test%'
AND UPPER(caseInsensitiveField) like 'G2%'
在 SQLite 中,您可以使用
GLOB
代替 LIKE
进行模式搜索。例如:
SELECT * FROM mytable
WHERE caseSensitiveField GLOB 'test*'
AND caseInsensitiveField LIKE 'g2%'
通过这种方法,您不必担心
PRAGMA
。
使用普通比较,默认情况下区分大小写(除非您已声明列
COLLATE NOCASE
):
SELECT *
FROM mytable
WHERE caseSensitiveField >= 'test'
AND caseSensitiveField < 'tesu'
AND caseInsensitiveField LIKE 'g2%'
仅当原始
LIKE
正在搜索前缀时才有效,但允许使用索引。
我知道这是一个老问题,但如果您正在使用 Java 进行编码并遇到此问题,这可能会有所帮助。您可以注册一个处理类似检查的函数。我从这篇文章中得到了提示:https://stackoverflow.com/a/29831950/1271573
我依赖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());
}
我使用正则表达式来完成我需要的操作。我想识别所有出现的单词“In”,但不全是小写。
select [COL] from [TABLE] where [COL] REGEXP '\bIn\b';
示例:
with x as (select 'in' Diff_Ins union select 'In' Diff_Ins)
select Diff_Ins from x where Diff_Ins REGEXP '\bIn\b';
正如其他人提到的,SQLite 还提供了区分大小写的
GLOB
函数。
假设
g2*
是用户在应用程序级别输入的文本。为了简化应用程序端语法并使 GLOB
不区分大小写,需要将文本规范化为常见大小写:
SELECT * FROM mytable WHERE LOWER(caseInsensitiveField) GLOB LOWER('g2*');
如果需要 UNICODE,请仔细测试
LOWER
和 UPPER
以确认它们按预期运行。 GLOB
是SQLite特有的扩展函数。构建支持多个数据库供应商的通用语法引擎并非易事。
SQLite 具有
<exp> COLLATE <collate>
,可以将其添加到任何表达式中以使其区分大小写或不区分大小写。
SELECT * FROM mytable
WHERE caseSensitiveField like 'test%'
AND caseInsensitiveField like 'G2%' COLLATE NOCASE