我有一个名为tbl
的表:
name | family
ali | rezaei
amir | hoseini
milad | karimi
alireza | amiri
hossein | mahmoodi
我写这个查询
SELECT * FROM tbl WHERE name LIKE '%a%';
它起作用了,它返回了:
ali,amir,milad,alireza
但是当我编写此查询时
SELECT * FROM tbl WHERE name LIKE 'a%';
它什么也没返回!
LIKE 'something%'
对我不起作用,但是LIKE '%something'
和LIKE '%something%'
对我有用。
答案 0 :(得分:0)
... 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行在名称列中包含a每套,共2套,共8套);按照:-
第二个查询是最有选择性的查询,因为第一个字符 a 是第一组数据,所以仅返回3行,而第二组的相似行将不返回,因为a前面有一个空格(此可疑情况);按照:-
第三个查询是第二个查询的改编,它修剪了前导空白(空格),从每个集合返回3行;按照:-