string比较时如何设置Sqlite3不区分大小写?
我想通过string匹配从sqlite3数据库中selectlogging。 但是如果在where子句中使用'=',我发现sqlite3区分大小写。 谁能告诉我如何使用string比较不区分大小写?
你可以在你的SELECT
查询中使用COLLATE NOCASE
:
SELECT * FROM ... WHERE name = 'someone' COLLATE NOCASE
另外,在SQLite中,通过在列定义中指定collate nocase
(其他选项是binary
(默认值)和rtrim
;请参阅此处 )创build表时,可以指示列应该不区分大小写。 您也可以在创build索引时指定collate nocase
。 例如:
创build表testing ( Text_Value文本整理nocase ); 插入testing值('A'); 插入testing值('b'); 插入testing值('C'); 创build索引Test_Text_Value_Index 在testing(Text_Value collate nocase);
涉及Test.Text_Value
expression式现在应该不区分大小写。 例如:
sqlite>从testing中selectText_Value其中Text_Value ='B'; TEXT_VALUE ---------------- b sqlite>从Test order by Text_Value中selectText_Value; TEXT_VALUE ---------------- 一个 b C sqlite>从Test order by Text_Value desc中selectText_Value; TEXT_VALUE ---------------- C b 一个
优化程序还可以使用该索引进行不区分大小写的search和匹配。 你可以使用explain
SQL命令来检查它,例如:
sqlite>解释从Test中selectText_Value其中Text_Value ='b'; addr操作码p1 p2 p3 ---------------- -------------- ---------- ---------- --------------------------------- 0转到0 16 1整数0 0 2 Openinfo 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第1栏 12callback1 0 13下一页1 9 14closures1 0 15停止0 0 16交易0 0 17 VerifyCookie 0 4 18转到0 1 19 Noop 0 0
SELECT * FROM ... WHERE name = 'someone' COLLATE NOCASE
你可以这样做:
SELECT * FROM ... WHERE name LIKE 'someone'
(这不是解决scheme,但在某些情况下非常方便)
“ LIKE运算符进行模式匹配比较,右边的操作数包含模式,左边的操作数包含匹配模式的string,模式中的百分号(”%“)匹配零或更多string中的下划线(“_”)与string中的任何单个字符相匹配,任何其他字符与 自身 匹配, 或者 与 大小写 相当(即不区分大小写的 匹配) (一个bug:SQLite只能理解例如,expression式'a'LIKE'A'为TRUE,但'æ'LIKE'Æ'为FALSE。)对于超出ASCII范围的unicode字符,LIKE运算符是区分大小写的。 “。
这不是特定于sqlite,但你可以做
SELECT * FROM ... WHERE UPPER(name) = UPPER('someone')
这是您的一个可能的解决scheme
http://www.codeproject.com/KB/database/SQLiteUTF8CIComparison.aspx
另一种select是创build自己的自定义sorting规则。 然后,您可以在该列上设置该sorting规则,或者将其添加到您的select子句中。 它将用于sorting和比较。
这可以用来使'VOILA'像'voilà'。
http://www.sqlite.org/capi3ref.html#sqlite3_create_collation
如果第一个string分别小于,等于或大于第二个string,则整理函数必须返回一个负数,零或正的整数。
另一个select可能会或可能没有意义,在您的情况下,实际上有一个单独的列与现有的列pre-lowererscored值。 这可以使用SQLite函数LOWER()
来填充,然后您可以在该列上执行匹配。
显然,它增加了冗余性和潜在的不一致性,但是如果你的数据是静态的,它可能是一个合适的select。
如果这个列的types是char
那么你需要把你正在查询的值加上空格,请参考这个问题。 这除了使用COLLATE NOCASE
或其他解决scheme之一(上()等)。
您可以使用类似的查询来比较各个string与表值。
从table_name中select列名称,其中列名称为“各自的比较值”;
它为我工作完美。 SELECT NAME FROM TABLE_NAME WHERE NAME = 'test Name' COLLATE NOCASE