Sqlite-SELECT * FROM tbl,其中的名称类似于'a%';不工作吗?

时间:2018-06-19 16:43:45

标签: sqlite select sql-like

我有一个名为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%'对我有用。

1 个答案:

答案 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套);按照:-

enter image description here

第二个查询是最有选择性的查询,因为第一个字符 a 是第一组数据,所以仅返回3行,而第二组的相似行将不返回,因为a前面有一个空格(此可疑情况);按照:-

enter image description here

第三个查询是第二个查询的改编,它修剪了前导空白(空格),从每个集合返回3行;按照:-

enter image description here