344

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

4

11 回答 11

556

您可以COLLATE NOCASESELECT查询中使用:

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

collate nocase另外,在 SQLite 中,您可以通过在列定义中指定(其他选项是binary(默认)和rtrim;参见此处)来指示在创建表时该列不区分大小写。您也可以指定collate nocase何时创建索引。例如:

创建表测试
(
  Text_Value 文本整理 nocase
);

插入测试值('A');
插入测试值('b');
插入测试值('C');

创建索引 Test_Text_Value_Index
  在测试(Text_Value 整理 nocase);

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

sqlite> 从测试中选择 Text_Value 其中 Text_Value = 'B';
文本值      
----------------
b               

sqlite> 从 Text_Value 的测试订单中选择 Text_Value;
文本值      
----------------
一种               
b               
C    

sqlite> select Text_Value from Test order by Text_Value desc;
文本值      
----------------
C               
b               
一种               

优化器还可以潜在地利用索引在列上进行不区分大小写的搜索和匹配。您可以使用explainSQL 命令进行检查,例如:

sqlite> 解释 select Text_Value from Test where Text_Value = 'b';
地址操作码 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 为空 -1 14                                           
6 制作记录 1 0 一个                                
7 内存存储 0 0                                            
8 移动锗 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 验证Cookie 0 4                                            
18 转到 0 1                                            
19 午饭 0 0                                            
于 2009-06-10T05:22:25.607 回答
150
SELECT * FROM ... WHERE name = 'someone' COLLATE NOCASE
于 2009-06-10T05:17:56.017 回答
51

你可以这样做:

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

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

LIKE运算符进行模式匹配比较。右侧的操作数包含模式,左侧的操作数包含与模式匹配的字符串。模式中的百分号 (“%”) 匹配任何零或多个序列字符串中的字符。模式中的下划线(“_”)匹配字符串中的任何单个字符。任何其他字符匹配 自身或其小写/大写 等效项(即不区分大小写的 匹配)。(一个错误:SQLite 只能理解ASCII 字符的大小写。LIKE 运算符对超出 ASCII 范围的 unicode 字符区分大小写。例如,表达式 'a' LIKE 'A' 为 TRUE 但 'æ' LIKE 'Æ'是错误的。)。

于 2009-06-10T04:18:05.957 回答
42

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

SELECT * FROM ... WHERE UPPER(name) = UPPER('someone')
于 2009-06-10T03:21:50.087 回答
6

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

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

http://www.sqlite.org/capi3ref.html#sqlite3_create_collat​​ion

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

于 2014-10-21T17:27:11.933 回答
2

在您的情况下可能有意义或可能没有意义的另一个选项是实际上有一个单独的列,其中包含现有列的预降分值。这可以使用 SQLite 函数填充LOWER(),然后您可以在此列上执行匹配。

显然,它增加了冗余和潜在的不一致,但如果您的数据是静态的,它可能是一个合适的选择。

于 2017-04-23T03:00:57.220 回答
0

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

于 2013-05-01T07:28:06.593 回答
0

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

于 2017-09-20T09:29:42.763 回答
0

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

SELECT * FROM ... WHERE name = 'someone' COLLATE NOCASE
于 2018-09-27T06:27:29.067 回答
0

像这样使用

 "select * from $pwsXDataHistory where type = '$type' COLLATE NOCASE and $t_uStatus != '$DELETE' order by $t_name COLLATE NOCASE asc ");
于 2021-03-10T09:57:50.147 回答
-1

您可以使用类似查询将相应的字符串与表值进行比较。

从 table_name 中选择列名,其中列名如“各自的比较值”;

于 2017-06-29T04:20:24.640 回答