50

在 SQLite 中,可以使用以下命令更改“LIKE”的区分大小写行为:

PRAGMA case_sensitive_like=ON;
PRAGMA case_sensitive_like=OFF;

但是在我的情况下,我想执行一个查询,其中一部分区分大小写,一部分不区分大小写。例如:

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

这可能吗?

4

5 回答 5

44

您可以在不区分大小写的字段上使用 UPPER 关键字,然后将 like 语句大写。例如

SELECT * FROM mytable 
WHERE caseSensitiveField like 'test%' 
AND UPPER(caseInsensitiveField) like 'G2%'
于 2013-03-18T15:22:25.303 回答
5

使用普通比较,默认情况下区分大小写(除非您声明了 column COLLATE NOCASE):

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

这仅适用于原始LIKE搜索前缀,但允许使用索引。

于 2013-03-18T15:53:58.750 回答
3

我知道这是一个老问题,但是如果您使用 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());
}
于 2017-03-04T07:34:51.990 回答
2

在 SQLite 中,您可以使用 GLOB 而不是 LIKE 进行模式搜索。例如:

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

使用这种方法,您不必担心 PRAGMA。

于 2020-10-30T09:46:16.837 回答
0

我使用正则表达式来做我需要的事情。我想找出所有出现的单词“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';
于 2020-08-18T11:56:06.110 回答