区分大小写并且不像SQLite那样不敏感

时间:2013-03-18 15:18:55

标签: sqlite case-sensitive

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

PRAGMA case_sensitive_like=ON;
PRAGMA case_sensitive_like=OFF;

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

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

这可能吗?

6 个答案:

答案 0 :(得分:30)

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

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

答案 1 :(得分:4)

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

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

仅当原始LIKE正在搜索前缀但允许使用索引时才有效。

答案 2 :(得分:1)

我知道这是一个老问题,但如果您使用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());
}

答案 3 :(得分:1)

要对使用COLLATE NOCASE创建的列执行区分大小写的查询,请使用COLLATE BINARY:

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

答案 4 :(得分:0)

我使用正则表达式执行所需的操作。我想确定所有出现的“ In”一词不是全部小写。

df <- structure(list(Date_Time = c("11/01/2019 10:00", "11/01/2019 11:00", 
"11/01/2019 12:00", "11/01/2019 13:00", "11/01/2019 14:00", "11/01/2019 15:00", 
"11/01/2019 16:00", "10/03/2019 23:00","10/04/2019 1:00","10/28/2019 05:00:00 AM",
"10/28/2019 10:00:00 PM", "10/29/2019 02:00:00 AM", "10/29/2019 03:00:00 AM", 
"10/31/2019 01:00:00 PM", "10/31/2019 02:00:00 PM", "10/31/2019 10:00:00 PM"
)), class = "data.frame", row.names = c(NA, -16L))

示例:

select [COL] from [TABLE] where [COL] REGEXP '\bIn\b';

答案 5 :(得分:0)

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

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

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