... WHERE name LIKE '%a%' 会在名称列的任意位置找到 a(或 A)。
... WHERE name LIKE 'a%' 将仅限于查找 a(或 A)作为名称列的第一个字符,因此看起来一个字符(可能是空白字符)在第一个字符之前.
理想/正确的解决方案是查看行是如何插入的,看看是否只有值本身被插入。
一种解决方案可能是使用WHERE LTRIM(name) LIKE 'a%';,它会在进行比较之前从一开始就删除空格。
以下是使用 2 组数据的示例,以进行演示。
- 第一组数据与您期望的数据存储方式相同。
- 第二组是前面带有空白(空格)字符的数据。
:-
DROP TABLE IF EXISTS tbl;
CREATE TABLE IF NOT EXISTS tbl (name TEXT, family TEXT);
INSERT INTO tbl VALUES
('ali','rezaei'),
('amir','hoseini'),
('milad','karimi'),
('alireza','amiri'),
('hossein','mahmoodi'),
(' ali','rezaei'),
(' amir','hoseini'),
(' milad','karimi'),
(' alireza','amiri'),
(' hossein','mahmoodi')
;
随后运行的 3 个查询:-
SELECT * FROM tbl WHERE name LIKE '%a%';
SELECT * FROM tbl WHERE name LIKE 'a%';
SELECT * FROM tbl WHERE LTRIM(name) LIKE 'a%';
使用'%a%' 的第一个查询将返回名称列中任意位置带有a 的所有行(5 行中有 4 行在每组的名称列中包含一个2套共8个);根据:-
第二个查询是最有选择性的,只会从第一组数据中返回 3 行,因为 a 是第一个字符,而不会返回第二组中的相似行,因为a 前面有一个空格(这种可疑情况);根据:-
第三个查询是对第二个查询的改编,它修剪前导空白(空格),从每个集合中返回 3 行;根据:-