Sqlite 中大小写不敏感查询/删除某条记录

背景

项目中有时会需要忽略值的大小写来进行 sql 查询,数据库中存储的某个字段的值(字符串) 是大小写不固定的,所以单纯的把参数强转为大写或小写,也无法匹配成功,还好 sql 支持 upper 和 lower 函数。

函数说明

upper(‘aaa’) 函数
说明
将字符串 ‘aaa’ 转成大写,返回一个新的字符串。如果在 sql 语句构造时,为 upper 函数传入的是某个字段的名称,那么该函数会返回字段值的大写字符串。

lower(‘BBB’) 函数
说明
将字符串 ‘BBB’ 转成小写,返回一个新的字符串。如果在 sql 语句构造时,为 lower 函数传入的是某个字段的名称,那么该函数会返回字段值的小写字符串。

用例

  1. 以查询系统媒体库的 files 表为例,从 files 表中,查询 _data 字段的值为 ‘/storage/emulated/0/Music’ 的记录,忽略大小写。

sql 语句如下,

select * from files where upper(_data) = upper('/storage/emulated/0/Music');

查询结果如下,
在这里插入图片描述
注࿱

<think>好的,用户现在问的是SQLite中的模糊匹配。首先,我需要确认他们对模糊匹配的理解程度,可能他们是想在数据库里进行模式匹配,比如查找包含特定字符串的记录SQLite常用的模糊匹配方法通常是使用LIKE操作符或者GLOB,可能还有正则表达式,过正则表达式需要用户定义的函数支持。 用户之前的问题是关于删除字段中空格前的数据,现在转向模糊匹配,可能是他们在处理数据清洗或查询时遇到了相关需求。需要考虑到他们可能需要具体的例子和语法说明。 接下来,我需要回忆SQLite中LIKE和GLOB的区别。LIKE使用%和_作为通配符,而GLOB使用*和?,并且区分大小写。此外,需要提到REGEXP的使用限制,因为SQLite默认没有内置的正则表达式支持,但可以通过扩展实现。 用户可能想知道基本用法,比如如何匹配开头、中间或结尾的字符串,以及如何处理大小写敏感的情况。同时,可能需要提醒他们注意性能问题,比如前导通配符可能导致全表扫描,影响查询速度。 还要考虑用户是否需要实际案例,比如查询名字中包含特定字符的记录,或者更复杂的模式。此外,转义特殊字符的方法也是一个重要点,避免因为特殊字符导致查询错误。 是否需要提到使用索引优化模糊查询?虽然对于前导通配符的情况索引可能无效,但如果是固定前缀,比如LIKE 'abc%',索引还是可以派上用场的。这可能对用户优化查询性能有帮助。 另外,用户可能在处理字符串时遇到需要转义的情况,比如查询包含%或_本身的记录,这时候需要使用ESCAPE子句,比如LIKE '%\%%' ESCAPE '\',这样可以正确匹配百分号。 最后,要确保回答结构清晰,分点说明,每个部分都有示例,让用户能够逐步理解和应用。同时,注意事项部分需要涵盖常见陷阱,比如大小写敏感性和性能问题,以及使用正则表达式的限制。</think>在 SQLite 中实现模糊匹配主要通过 `LIKE` 和 `GLOB` 操作符,还支持正则表达式(需依赖扩展)。以下是具体用法和场景说明: --- ### **1. LIKE 操作符(基本模糊匹配)** - **语法**:`WHERE column LIKE pattern` - **通配符**: - `%`:匹配任意长度(包括零长度)的字符串。 - `_`:匹配单个字符。 - **示例**: ```sql -- 匹配以 "apple" 开头的字符串 SELECT * FROM fruits WHERE name LIKE 'apple%'; -- 匹配包含 "berry" 的字符串 SELECT * FROM fruits WHERE name LIKE '%berry%'; -- 匹配第三个字符为 "a" 的字符串(如 "banana") SELECT * FROM fruits WHERE name LIKE '__a%'; ``` --- ### **2. GLOB 操作符(区分大小写的模式匹配)** - **语法**:`WHERE column GLOB pattern` - **通配符**: - `*`:匹配任意长度字符串(类似 `%`)。 - `?`:匹配单个字符(类似 `_`)。 - **特点**:区分大小写,且使用 UNIX 风格的通配符。 - **示例**: ```sql -- 匹配以 "Apple" 开头的字符串(区分大小写) SELECT * FROM fruits WHERE name GLOB 'Apple*'; ``` --- ### **3. 正则表达式(需加载扩展)** SQLite **默认支持正则表达式**,但可通过用户自定义函数或加载扩展(如 `regexp`)实现: - **语法**:`WHERE column REGEXP pattern` - **示例**: ```sql -- 匹配包含数字的字符串(需提前加载正则扩展) SELECT * FROM products WHERE description REGEXP '\d+'; ``` > **注意**:需通过 `SQLITE_ENABLE_REGEXP` 编译选项或外部库启用正则功能。 --- ### **4. 转义特殊字符** 若需匹配通配符本身(如 `%`、`_`),需使用 `ESCAPE` 子句: ```sql -- 查找包含 "10%" 的字符串(如 "折扣10%") SELECT * FROM sales WHERE note LIKE '%10\%%' ESCAPE '\'; ``` --- ### **5. 常见使用场景** | **场景** | **示例** | **说明** | |-------------------------|-----------------------------------|-----------------------------| | 匹配开头/结尾 | `LIKE 'A%'` 或 `LIKE '%z'` | 筛选以特定字符开始/结束的数据 | | 包含特定片段 | `LIKE '%error%'` | 查找日志中的错误信息 | | 固定格式匹配 | `LIKE '__-___-____'` | 匹配电话号格式如 "12-345-6789" | | 排除特定内容 | `NOT LIKE '%test%'` | 过滤测试数据 | --- ### **注意事项** 1. **性能影响**:模糊匹配(尤其是以 `%` 开头)可能导致全表扫描,建议: - 对高频查询字段建立索引(但对前导通配符无效)。 - 结合其他件缩小查询范围。 2. **大小写敏感**: - `LIKE` 默认区分大小写(取决于 SQLite 编译配置)。 - 若需强制区分大小写,用 `GLOB` 或 `COLLATE BINARY`: ```sql SELECT * FROM table WHERE column LIKE 'A%' COLLATE BINARY; ``` 3. **扩展依赖**:正则表达式需额外配置,确保环境支持。 --- ### **实战示例** ```sql -- 创建测试表 CREATE TABLE books ( id INTEGER PRIMARY KEY, title TEXT ); -- 插入数据 INSERT INTO books (title) VALUES ('SQLite Guide'), ('Python for Beginners'), ('Advanced SQL Techniques'); -- 模糊查询:标题包含 "SQL" 或 "sql"(区分大小写) SELECT * FROM books WHERE title LIKE '%sql%'; -- 结果: -- 1 | SQLite Guide -- 3 | Advanced SQL Techniques ``` --- 通过合理使用 `LIKE`、`GLOB` 和正则表达式,可高效实现 SQLite 中的模糊匹配需求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ToSimpleL

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值