区分大小写并且像SQLite一样不敏感

Ric*_*ams 38 sqlite case-sensitive

在SQLite中,可以使用以下命令更改"LIKE"的区分大小写的行为:

PRAGMA case_sensitive_like=ON;
PRAGMA case_sensitive_like=OFF;
Run Code Online (Sandbox Code Playgroud)

但是在我的情况下,我想执行一个查询,其中一部分是区分大小写的,而其中一部分不是.例如:

SELECT * FROM mytable
WHERE caseSensitiveField like 'test%'
AND caseInsensitiveField like 'g2%'
Run Code Online (Sandbox Code Playgroud)

这可能吗?

rbe*_*ger 31

您可以在不区分大小写的字段中使用UPPER关键字,然后使用大写的like语句.例如

SELECT * FROM mytable 
WHERE caseSensitiveField like 'test%' 
AND UPPER(caseInsensitiveField) like 'G2%'
Run Code Online (Sandbox Code Playgroud)

  • 请注意,这不适用于非英文字母. (15认同)
  • @rbedger注意,你不需要Upper函数`,因为**Like**默认情况下不区分大小写. (9认同)
  • @ FrankN.Stein这是可行的,但不是开箱即用的.来自[官方常见问题解答](http://sqlite.org/faq.html#q18):`SQLite的默认配置仅支持对ASCII字符进行不区分大小写的比较. (2认同)
  • 通过编辑"UPPER()",您最终得到与OP在问题中发布的代码相同的代码.如果你想完全改变你的答案,或者如果你想删除你的答案,那就说出来; 但你做的编辑毫无意义. (2认同)

Yod*_*066 8

在 SQLite 中,您可以使用GLOB代替LIKE进行模式搜索。例如:

SELECT * FROM mytable
WHERE caseSensitiveField GLOB 'test*'
AND caseInsensitiveField LIKE 'g2%'
Run Code Online (Sandbox Code Playgroud)

通过这种方法,您不必担心PRAGMA

  • LIKE `'g2%'` 默认情况下仅对模式内的 ascii 字符不区分大小写。'%' 匹配的部分并不重要,因为它代表任何东西。但是,“g2”必须是非 unicode 字符才能进行不区分大小写的匹配。`'üb%'` 将匹配 `über` 但不匹配 `Über` 请参阅 https://www.sqlite.org/faq.html#q18 (3认同)

CL.*_*CL. 5

使用普通比较,默认情况下区分大小写(除非您声明了 column COLLATE NOCASE):

SELECT *
FROM mytable 
WHERE caseSensitiveField >= 'test'
  AND caseSensitiveField <  'tesu'
  AND caseInsensitiveField LIKE 'g2%'
Run Code Online (Sandbox Code Playgroud)

LIKE仅当原始数据正在搜索前缀时才有效,但允许使用索引。