Answers:
您可以COLLATE NOCASE
在SELECT
查询中使用:
SELECT * FROM ... WHERE name = 'someone' COLLATE NOCASE
另外,在SQLite中,您可以通过collate nocase
在列定义中指定(其他选项为binary
(默认)和rtrim
;参见此处)来指示在创建表时该列不区分大小写。您还可以指定collate nocase
何时创建索引。例如:
创建表测试 ( Text_Value文本不区分大小写 ); 插入测试值('A'); 插入测试值(“ b”); 插入测试值(“ C”); 创建索引Test_Text_Value_Index 在测试(Text_Value整理无大小写);
Test.Text_Value
现在,涉及的表达式应该不区分大小写。例如:
sqlite>从Test中选择Text_Value,其中Text_Value ='B'; 文字值 ---------------- b sqlite>从测试顺序中选择Text_Value通过Text_Value; 文字值 ---------------- 一个 b C sqlite>从测试顺序中按Text_Value desc选择Text_Value; 文字值 ---------------- C b 一个
优化程序还可以潜在地利用索引进行不区分大小写的列搜索和匹配。您可以使用explain
SQL命令进行检查,例如:
sqlite>解释一下,从Test中选择Text_Value,其中Text_Value ='b'; addr操作码p1 p2 p3 ---------------- -------------- ---------- ---------- --------------------------------- 0转到0 16 1整数0 0 2 OpenRead 1 3 keyinfo(1,NOCASE) 3 SetNumColumns 1 2 4字符串8 0 0 b 5 IsNull -1 14 6 MakeRecord 1 0 a 7存储器0 0 8 MoveGe 1 14 9内存加载0 0 10 IdxGE 1 14 + 11栏1 0 12回叫1 0 13下一个1 9 14关闭1 0 15暂停0 0 16交易0 0 17 VerifyCookie 0 4 18转到0 1 19 Noop 0 0
COLLATE NOCASE
如果字段本身已经定义了此排序规则,则无需添加到索引:“ 默认的排序顺序是在CREATE TABLE语句中为该列定义的排序顺序。 ”
COLLATE NOCASE
仅适用于ASCII文本。列值中一旦包含“FIANCÉ”或“voilà”,就不会与“fiancé”或“ VOILA”匹配。启用ICU扩展后,LIKE
变为不区分大小写,这'FIANCÉ' LIKE 'fiancé'
是true,但'VOILA' LIKE 'voilà'
仍然是false。而且ICU + LIKE的缺点是不使用索引,因此在大表上速度可能很慢。
select * from tbl where firstname='john' and lastname='doe' COLLATE NOCASE
上将不区分大小写lastname
。要不区分大小写firstname
,请输入:select * from tbl where firstname='john' COLLATE NOCASE and lastname='doe'
。它特定于那一列,而不是整个where
子句。
SELECT * FROM ... WHERE name = 'someone' COLLATE NOCASE
您可以这样做:
SELECT * FROM ... WHERE name LIKE 'someone'
(这不是在解决办法,但在某些情况下是非常方便)
“ LIKE运算符进行模式匹配比较。右侧的操作数包含模式,左侧的操作数包含要与模式匹配的字符串。模式中的百分号(“%”)匹配零或更大的任何序列字符串中的字符。模式中的下划线(“ _”)匹配字符串中的任何单个字符。其他任何字符都匹配 自身或其 等效的大小写 (不区分大小写)(错误:SQLite仅理解ASCII字符的大写/小写LIKE运算符对ASCII范围之外的Unicode字符区分大小写,例如,表达式'a'LIKE'A'为TRUE,但'æ'LIKE'Æ'是FALSE。”。
这不是特定于sqlite,但您可以做
SELECT * FROM ... WHERE UPPER(name) = UPPER('someone')
另一种选择是创建自己的自定义排序规则。然后,您可以在列上设置该排序规则,或将其添加到select子句中。它将用于排序和比较。
这可以用来使'VOILA'像'voilà'。
http://www.sqlite.org/capi3ref.html#sqlite3_create_collation
如果第一个字符串分别小于,等于或大于第二个字符串,则整理函数必须返回一个负数,零或正数的整数。
简单来说,您可以在SELECT查询中使用COLLATE NOCASE:
SELECT * FROM ... WHERE name = 'someone' COLLATE NOCASE
您可以使用like查询将各个字符串与表值进行比较。
从table_name中选择列名,其中列名如“各自比较值”;
它为我完美地工作。
SELECT NAME FROM TABLE_NAME WHERE NAME = 'test Name' COLLATE NOCASE