像SQLite一样区分大小写和不敏感

j0pj023g  于 2023-11-21  发布在  SQLite
关注(0)|答案(7)|浏览(157)

在SQLite中,可以通过使用以下命令更改“LIKE”的大小写敏感行为:

PRAGMA case_sensitive_like=ON;
PRAGMA case_sensitive_like=OFF;

字符串
然而,在我的情况下,我想执行一个查询,其中一部分是大小写敏感的,另一部分不是。例如:

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


这可能吗?

kxxlusnw

kxxlusnw1#

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

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

字符串
只有当原始LIKE正在搜索前缀时才有效,但允许使用索引。

disbfnqx

disbfnqx2#

我知道这是一个老问题,但如果你是在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')

字符串
下面是我的Contains函数:

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());
}

velaa5lx

velaa5lx3#

我使用了一个正则表达式来做我需要做的事情。我想识别所有出现的单词“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';

bybem2ql

bybem2ql4#

正如其他人提到的,SQLite还提供了GLOB函数,它是大小写敏感的。
假设g2*是用户在应用程序级别输入的文本。为了简化应用程序端语法并使GLOB不区分大小写,需要将文本规范化为常见的大小写:

SELECT * FROM mytable WHERE LOWER(caseInsensitiveField) GLOB LOWER('g2*');

字符串
如果需要UNICODE,请仔细测试LOWERUPPER,以确认它们按预期运行。GLOB是SQLite特有的扩展函数。构建一个支持多个数据库供应商的通用语法引擎并非易事。

35g0bw71

35g0bw715#

SQLite有<exp> COLLATE <collate>,它可以添加到任何表达式中,使其区分大小写或不敏感。

SELECT * FROM mytable 
WHERE caseSensitiveField like 'test%' 
AND caseInsensitiveField like 'G2%' COLLATE NOCASE

字符串

bvn4nwqk

bvn4nwqk6#

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

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

字符串

kq4fsx7k

kq4fsx7k7#

在SQLite中,可以使用GLOB代替LIKE进行模式搜索。例如:

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

字符串
使用这种方法,您不必担心PRAGMA

相关问题