我想通过字符串匹配从sqlite3数据库选择记录。但是如果我在where子句中使用'=',我发现sqlite3是区分大小写的。有人能告诉我如何使用字符串比较不区分大小写吗?
当前回答
你可以在SELECT查询中使用COLLATE NOCASE:
SELECT * FROM ... WHERE name = 'someone' COLLATE NOCASE
此外,在SQLite中,您可以在创建表时通过在列定义中指定collate nocase来指示列不区分大小写(其他选项是二进制(默认值)和rtrim;见这里)。您也可以在创建索引时指定collate nocase。例如:
create table Test ( Text_Value text collate nocase ); insert into Test values ('A'); insert into Test values ('b'); insert into Test values ('C'); create index Test_Text_Value_Index on Test (Text_Value collate nocase);
涉及Test的表达式。Text_Value现在应该不区分大小写。例如:
sqlite> select Text_Value from Test where Text_Value = 'B'; Text_Value ---------------- b sqlite> select Text_Value from Test order by Text_Value; Text_Value ---------------- A b C sqlite> select Text_Value from Test order by Text_Value desc; Text_Value ---------------- C b A
优化器还可能利用索引对列进行不区分大小写的搜索和匹配。你可以使用explain SQL命令来检查,例如:
sqlite> explain select Text_Value from Test where Text_Value = 'b'; addr opcode p1 p2 p3 ---------------- -------------- ---------- ---------- --------------------------------- 0 Goto 0 16 1 Integer 0 0 2 OpenRead 1 3 keyinfo(1,NOCASE) 3 SetNumColumns 1 2 4 String8 0 0 b 5 IsNull -1 14 6 MakeRecord 1 0 a 7 MemStore 0 0 8 MoveGe 1 14 9 MemLoad 0 0 10 IdxGE 1 14 + 11 Column 1 0 12 Callback 1 0 13 Next 1 9 14 Close 1 0 15 Halt 0 0 16 Transaction 0 0 17 VerifyCookie 0 4 18 Goto 0 1 19 Noop 0 0
其他回答
你可以在SELECT查询中使用COLLATE NOCASE:
SELECT * FROM ... WHERE name = 'someone' COLLATE NOCASE
此外,在SQLite中,您可以在创建表时通过在列定义中指定collate nocase来指示列不区分大小写(其他选项是二进制(默认值)和rtrim;见这里)。您也可以在创建索引时指定collate nocase。例如:
create table Test ( Text_Value text collate nocase ); insert into Test values ('A'); insert into Test values ('b'); insert into Test values ('C'); create index Test_Text_Value_Index on Test (Text_Value collate nocase);
涉及Test的表达式。Text_Value现在应该不区分大小写。例如:
sqlite> select Text_Value from Test where Text_Value = 'B'; Text_Value ---------------- b sqlite> select Text_Value from Test order by Text_Value; Text_Value ---------------- A b C sqlite> select Text_Value from Test order by Text_Value desc; Text_Value ---------------- C b A
优化器还可能利用索引对列进行不区分大小写的搜索和匹配。你可以使用explain SQL命令来检查,例如:
sqlite> explain select Text_Value from Test where Text_Value = 'b'; addr opcode p1 p2 p3 ---------------- -------------- ---------- ---------- --------------------------------- 0 Goto 0 16 1 Integer 0 0 2 OpenRead 1 3 keyinfo(1,NOCASE) 3 SetNumColumns 1 2 4 String8 0 0 b 5 IsNull -1 14 6 MakeRecord 1 0 a 7 MemStore 0 0 8 MoveGe 1 14 9 MemLoad 0 0 10 IdxGE 1 14 + 11 Column 1 0 12 Callback 1 0 13 Next 1 9 14 Close 1 0 15 Halt 0 0 16 Transaction 0 0 17 VerifyCookie 0 4 18 Goto 0 1 19 Noop 0 0
可以使用like查询将各自的字符串与表值进行比较。
Select column name from table_name where column name like '各自的比较值';
这不是特定于sqlite,但你可以这样做
SELECT * FROM ... WHERE UPPER(name) = UPPER('someone')
另一种选择可能对您的情况有意义,也可能没有意义,那就是实际上有一个单独的列,其中包含现有列的预先低分值。可以使用SQLite函数LOWER()填充该列,然后可以对该列执行匹配。
显然,它增加了冗余和潜在的不一致性,但如果您的数据是静态的,它可能是一个合适的选择。
如果列的类型是char,那么你需要用空格来附加你正在查询的值,请参考这里的问题。除此之外,还可以使用COLLATE NOCASE或其他解决方案(upper()等)。
推荐文章
- SQLite数据库文件使用什么扩展名重要吗?
- 无法加载DLL 'SQLite.Interop.dll'
- 快速简单的方法迁移SQLite3到MySQL?
- 我如何做一个不区分大小写的字符串比较?
- Oracle中不区分大小写的搜索
- 在Ubuntu上安装sqlite3-ruby错误
- sqlite3。ProgrammingError:提供的绑定数量不正确。当前语句使用1,并提供了74个
- SQLite有。net / c#包装器吗?
- 如何在Django ORM中查询不区分大小写的数据?
- Android开发有什么好的ORM工具吗?
- 不区分大小写的搜索
- 如何在SQLite中看到表的结构?
- Android中使用的SQLite版本?
- 如何在JavaScript中执行不区分大小写的字符串排序数组?
- Core Data vs SQLite 3