如何在字符串比较时将Sqlite3设置为不区分大小写?

时间:2009-06-10 03:19:49

标签: sqlite case-insensitive

我想通过字符串匹配从sqlite3数据库中选择记录。但是如果我在where子句中使用'=',我发现sqlite3区分大小写。谁能告诉我如何使用字符串比较不区分大小写?

11 个答案:

答案 0 :(得分:437)

您可以在COLLATE NOCASE查询中使用SELECT

SELECT * FROM ... WHERE name = 'someone' COLLATE NOCASE

另外,在SQLite中,通过在列定义中指定collate nocase来创建表时,可以指示列应该不区分大小写(其他选项为binary(默认值)和{ {1}};请参阅here)。您也可以在创建索引时指定rtrim。例如:

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

涉及collate nocase的表达式现在应该不区分大小写。例如:

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               

优化器还可以利用索引对列进行不区分大小写的搜索和匹配。您可以使用Test.Text_Value 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                                            

答案 1 :(得分:144)

SELECT * FROM ... WHERE name = 'someone' COLLATE NOCASE

答案 2 :(得分:42)

你可以这样做:

SELECT * FROM ... WHERE name LIKE 'someone'

(它不是 解决方案,但在某些情况下非常方便)

  

LIKE 运算符执行模式   匹配比较。操作数   右边包含图案,   左手操作数包含字符串   与模式相匹配。一个   模式中的百分号(“%”)   匹配任何零或更多的序列   字符串中的字符。一个   模式中的下划线(“_”)   匹配中的任何单个字符   串。 任何其他角色匹配   本身或其大/小写   等效(即不区分大小写   的匹配)即可。 (一个错误:仅限SQLite   了解ASCII的大小写   字符。 LIKE运算符是大小写的   对unicode字符敏感   超出了ASCII范围。对于   例如,表达'a'LIKE'A'   是的,但是'æ'LIKE'Æ'是假的。)。“

答案 3 :(得分:37)

这不是sqlite特有的,但你可以这样做

SELECT * FROM ... WHERE UPPER(name) = UPPER('someone')

答案 4 :(得分:4)

另一种选择是创建自己的自定义排序规则。然后,您可以在列上设置该排序规则或将其添加到您的select子句中。它将用于订购和比较。

这可以用来制作'VOILA'LIKE'voilà'。

http://www.sqlite.org/capi3ref.html#sqlite3_create_collation

  

如果第一个字符串分别小于,等于或大于第二个字符串,则整理函数必须返回一个负数,零或正整数。

答案 5 :(得分:2)

在您的情况下可能有意义或可能没有意义的另一个选项是实际上有一个单独的列,其中包含现有列的预先降低的值。这可以使用SQLite函数url(r'^(?P<faculty>[\w-]+)/(?P<program>[\w-]+)/(?P<slug>[\w-]+)/$', profile, name='profile'), 填充,然后您可以在此列上执行匹配。

显然,它会增加冗余并存在不一致的可能性,但如果您的数据是静态的,那么它可能是一个合适的选择。

答案 6 :(得分:1)

如果列的类型为char,那么您需要使用空格追加要查询的值,请参阅此问题here。除了使用COLLATE NOCASE或其他解决方案之一(upper()等)之外。

答案 7 :(得分:1)

您可以使用类似的查询来比较相应的字符串和表格值。

从table_name中选择列名称,其中列名称类似于“相应的比较值”;

答案 8 :(得分:1)

简单来说,您可以在SELECT查询中使用COLLATE NOCASE:

SELECT * FROM ... WHERE name = 'someone' COLLATE NOCASE

答案 9 :(得分:0)

它完美地为我工作。  SELECT NAME FROM TABLE_NAME WHERE NAME = 'test Name' COLLATE NOCASE

答案 10 :(得分:0)

这样使用

 "select * from $pwsXDataHistory where type = '$type' COLLATE NOCASE and $t_uStatus != '$DELETE' order by $t_name COLLATE NOCASE asc ");
相关问题